在创建它时引用javascript对象属性(使用此属性)

时间:2011-09-09 18:47:30

标签: javascript oop

你能解释一下为什么这个对象不理解'这个'吗?

var circle = {
                radius : 20,
                x : 100 - this.radius / 2,
                y : 100 - this.radius / 2,
             }

console.log(circle.x) // returns NaN, why?

5 个答案:

答案 0 :(得分:5)

  1. 因为这不是this在JS中的工作方式。当您以某种方式使将对象指定为函数调用上下文的this值时,this将只是对象的引用。

  2. 您在创建对象文字时无法引用它,因为它尚不存在。

  3. 如果您正在创建圈子,可以考虑使用构造函数:

     function Circle(radius) {
        this.radius = radius,
        this.x = 100 - this.radius / 2,
        this.y = 100 - this.radius / 2,
     }
    
     var circle_20 = new Circle( 20 );
    

    因为您使用Circle作为构造函数调用new,所以构造函数调用中的this将是对正在创建的对象的引用。隐式返回该对象,因为您没有显式返回其他对象。

答案 1 :(得分:3)

这是一个简单的说明:

//Saul was born:  Initialize the parent!
var parent = {
    youngestChild: 'Small Saul'
};

//Tim was born:  Overwrite the parent!
parent = {
    youngestChild: 'Tiny Tim',
    currentYoungestChild: parent.youngestChild
};

alert(parent.currentYoungestChild);


谁是parent.currentYoungestChild

与许多开发人员一样,我认为parent.youngestChild在设置为'Tiny Tim'之前会设置为parent.child。如果是这种情况,则将其设置为'Tiny Tim'

然而,事实证明所有儿童在被存储在父母之前进行评估,所以

parent.currentYoungestChild == 'Small Saul'
如果你想尝试一下,

Here是个小提琴。

对此功能的一种解释是因为子声明的顺序无关紧要。例如,如果按顺序评估和存储对象,则以下内容会产生不同的结果:

parent = {
    currentYoungestChild: parent.youngestChild,
    youngestChild: 'Tiny Tim'
}; 

长话短说:在对象声明中初始化来自其他子元素的子元素将不起作用!

答案 2 :(得分:2)

因为在何处定义,this不是circle对象。

怎么样:

var circle = {
  radius: 20,

  getX: function() { return (100) - this.radius / 2; },
  getY: function() { return (100) - this.radius / 2; }
}

答案 3 :(得分:1)

该对象尚不存在。在计算所有内容之后它只存在,因此在计算它时使用该对象为时尚早。

相反,您可以计算闭包中的值,以便您可以安全地单独计算它们,并返回对象:

var circle = (function() {
    var radius = 20,
        x      = 100 - radius / 2,
        y      = 100 - radius / 2;

    return { radius: radius,
             x:      x,
             y:      y      };
})();

// now circle is the wanted object,
// and you don't leave the `var` variables separately.

答案 4 :(得分:0)

您正在获得该结果,因为在该上下文中,这并不是指正在创建的对象。

在JavaScript中无法完成您正在尝试的内容(在对象声明中)。唯一的解决方法是:

var newRadius = 20

var circle = {
                 radius: newRadius,
                 x: 100 - newRadius / 2,
                 y: 100 - newRadius / 2
             };

console.log(circle.x);