Javascript分配和删除属性

时间:2018-08-24 04:48:04

标签: javascript object properties assign

有人可以解释一下这里到底发生了什么吗?

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

2 个答案:

答案 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.99customObject.price就是这样做的。)

如果我们调用get_price,我们将得到myObject.get_price(),而在myObject.price中,我们将得到customObject.get_price()。尽管customObject.price函数实际上位于get_price内部,但是函数调用中的特殊变量customObject.__proto__指向调用该函数的对象,而不是该函数所属的对象

如果您认为同一个函数可以属于不同的对象,那么这很有意义。