объект litrals инстанция не работает - PullRequest
0 голосов
/ 10 марта 2012

Я создал объект с помощью литералов и создания экземпляров с помощью оператора 'new'.Но это не работает.Вот мой код:

var rectangle = { 
    upperLeft : { x : 2, y : 2 },
    lowerRight : { x : 4, y : 4}
}
var r=new rectangle;
alert(r.upperLeft.x) // will yield 2

Я пытался использовать круглые скобки после имени объекта при создании экземпляра:

var r=new rectangle;

Но это также не работает.Я пытался создать объект с помощью оператора функции, и это работает нормально, но я хочу сделать это таким образом.Помощь.

Ответы [ 4 ]

1 голос
/ 10 марта 2012

Вы, вероятно, имеете в виду

var r = Object.create(rectangle);

Вот оно: http://jsfiddle.net/Cra8Q/

ДОПОЛНЕНИЕ

"Старый" способ в JavaScript для создания группы прямоугольников состоит в использовании оператора new. Способ сделать это так:

function Rectangle(x1, y1, x2, y2) {
    this.upperLeft = {x: x1, y: y1};
    this.lowerRight = {x: x2, y: y2};
}

var r = new Rectangle(2, 2, 4, 4);

alert(r.upperLeft.x);

См. http://jsfiddle.net/uDs3N/

Проблема с кодом в вопросе заключалась в том, что rectangle был настоящим прямоугольным объектом, а не конструктором, поэтому его нельзя было использовать с new. Оператор new может использоваться только перед вызовом функции.

Тем не менее, более современный подход заключается в создании прототипа прямоугольного объекта и получении новых прямоугольников с помощью Object.create. Тем не менее, конструкторский подход все еще популярен.

0 голосов
/ 10 марта 2012

Оператор new принимает функцию , а не объект.То, что вы пытаетесь, не сработает.

Вот как new работает:

function Rectangle() {
    this.upperLeft = {x: 2, y: 2};
    this.lowerRight = {x: 4, y: 4};
}

var r = new Rectangle();

Часть операции var r = new Rectangle() похожа на эту:

var r = {};
Rectangle.call(r); // makes r available as `this` in the function

Это далеко не эквивалентно тому, что new делает ;он оставляет все виды прототипов магии и прочего.

Но он показывает, почему аргумент new должен быть функцией.

0 голосов
/ 10 марта 2012

rectangle - это, как вы заметили, Object Literal. Это не функция конструктора, это единственный экземпляр Object. Если вы хотите, чтобы у rectangle было больше экземпляров, используйте что-то вроде:

function Rectangle(ul,lr){
  var default = {x:0,y:0};
  return {
          upperLeft: ul || default, 
          lowerRight: lr || default 
         };
}

var r1 = new Rectangle({x:2,y:2},{x:4,y:4}),
    r2 = new Rectangle({x:3,y:3},{x:5,y:5}),
    r3 = new Rectangle;

r1.upperleft.x; //=> 2
r2.upperleft.x; //=> 3
r3.upperLeft.x = 5;
r3.upperLeft.y = 7;
alert(r3.upperLeft.x; //=> 5
0 голосов
/ 10 марта 2012

Другой способ создать объект с оператором «new» - определить функцию конструктора, например:

var Rectangle = function()
{
    this.upperLeft = { x : 2, y : 2 },
    this.lowerRight = { x : 4, y : 4}
}

var rect = new Rectangle();
alert(rect.upperLeft.x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...