如何防止javascript分配创建ownProperty

时间:2015-12-30 07:50:53

标签: javascript

以下是一个例子:

var cat1 = Object.create({
  name: "mia"
});

cat1.hasOwnProperty('name') // false
cat1.name = "haha";
cat1.hasOwnProperty('name') // true

这对我来说相当令人惊讶。

1)这里的设计意图是什么?

2)如何在不创建新属性的情况下使用=

3 个答案:

答案 0 :(得分:2)

  

这里的设计意图是什么?

我没有设计JavaScript,但我的猜测是限制"范围"突变想象一下,你有两个对象:

var proto = {name: "mia"};
var cat1 = Object.create(proto);
var cat2 = Object.create(proto);

如果分配给cat1.name 会创建新属性,而是更新原型属性,那么cat2.name也会突然更新。

换句话说,如果赋值是更新原型属性而不是对象自己的属性,那么其他对象可能会受到更改的影响,而您甚至不知道它。

  

如何在不创建新属性的情况下使用=

你做不到。您可以明确地分配给原型,但这需要您知道属性是在原型上定义的:

Object.getPrototypeOf(cat1).name = 'haha';

答案 1 :(得分:0)

hasOwnProperty显示在对象上定义的属性。同时:

Object.create({
  name: "mia"
});

使用原型{name: "mia"}创建新对象。这意味着将为原型而不是对象定义属性name。使用原型进行某种优化。不同的对象与原型共享相同的逻辑。此方法也不重复,因此使用的内存较少。 当您通过=定义拥有属性时,您将在原型中显示具有相同名称的属性,因此@Felix Kling表示您不会更改原型中的属性以及其他使用的对象相同的原型不会受到影响。你也可以使用Object.defineProperty(obj, prop, descriptor)而不是=来定义对象的自有属性,但是你不能在对象上使用=而不定义你可以直接在原型上做的新属性像这样:

cat1.__proto__.name="other name" //avoid, this is not the best practive at all

答案 2 :(得分:0)

按照设计,当您从原型创建对象时,新对象将与原型对象共享属性,直到您为该对象上的该属性显式赋值,一旦它被赋值,从那时起对象将保持其自己的状态。下面是相同的示例代码。

var x = {"name":"mia"};
var o1= Object.create(x);
var o2= Object.create(x);
console.log(x.name,o1.name,o2.name); //output: mia,mia,mia
x.name="xxx";
console.log(x.name,o1.name,o2.name); //output: xxx,xxx,xxx

o1.name="yyy";
console.log(x.name,o1.name,o2.name); //output: xxx,yyy,xxx