有人可以解释一下这里到底发生了什么吗?
var myObject = {
price: 20.99,
get_price: function() {
return this.price;
}
};
var customObject = Object.create(myObject);
customObject.price = 19.99;
delete customObject.price;
console.log(customObject.get_price()); //returns 20.99
答案 0 :(得分:2)
发生这种情况是由于prototype-chain的后果。声明
var customObject = Object.create(myObject);
创建一个原型设置为myObject
的对象。现在,您正在为其分配和删除属性price
。但这并不会改变其原型中已经存在的东西。
您可以通过在删除属性customObject
之前将price
打印到控制台来进行尝试。您将看到该对象包含属性price
,其值设置为19.99,但其__proto__
属性的price
仍为20.99。运行以下代码段,并在浏览器的控制台中观察输出。
var myObject = {
price: 20.99,
get_price: function() {
return this.price;
}
};
var customObject = Object.create(myObject);
customObject.price = 19.99;
console.log(customObject);
函数get_price
返回this.price
,该函数在当前对象中搜索属性price
,如果找不到,则递归遍历该属性的原型链。由于此属性存在于对象的直接原型中,因此将返回值20.99。
答案 1 :(得分:2)
Javascript中的所有对象都有一个__proto__
属性,称为其 prototype 。 (出于某些我不讨论的原因,它与某些功能上的prototype
属性不同。)
原型链是在被请求时查找某些名称的顺序。例如,dog.bark
将在'bark'
中搜索dog
,但是如果dog
没有'bark'
属性,它将在{{1}中搜索'bark'
},直到到达原型链的末尾。
使用方括号(dog.__proto__
)声明的新对象的原型为{}
。
函数Object
返回一个以Object.create(some)
作为原型的新对象。 (some
可以some
来创建没有原型的对象。)
null
在 * 中,对象var myObject = {
price: 20.99,
get_price: function() {
return this.price;
}
};
var customObject = Object.create(myObject);
customObject.price = 19.99; // *
delete customObject.price; // **
console.log(customObject.get_price());
如下所示:
customObject
在 ** 中,对象customObject = {
price: 19.99,
__proto__: {
price: 29.99,
get_price: function() { return this.price; }
}
};
如下所示:
customObject
delete operator 仅删除 own 属性,这意味着这些属性直接属于对象(而不是其原型)。
因此,我们删除了customObject = {
__proto__: {
price: 29.99,
get_price: function() { return this.price; }
}
};
,现在当我们尝试获取price: 19.99
时得到price: 29.99
(customObject.price
就是这样做的。)
如果我们调用get_price
,我们将得到myObject.get_price()
,而在myObject.price
中,我们将得到customObject.get_price()
。尽管customObject.price
函数实际上位于get_price
内部,但是函数调用中的特殊变量customObject.__proto__
指向调用该函数的对象,而不是该函数所属的对象
如果您认为同一个函数可以属于不同的对象,那么这很有意义。