你能解释一下为什么这个对象不理解'这个'吗?
var circle = {
radius : 20,
x : 100 - this.radius / 2,
y : 100 - this.radius / 2,
}
console.log(circle.x) // returns NaN, why?
答案 0 :(得分:5)
因为这不是this
在JS中的工作方式。当您以某种方式使将对象指定为函数调用上下文的this
值时,this
将只是对象的引用。
您在创建对象文字时无法引用它,因为它尚不存在。
如果您正在创建圈子,可以考虑使用构造函数:
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);