通过new创建的Javascript Object-Properties的所有权

时间:2013-02-26 14:23:01

标签: javascript

例如,如果我在我的应用程序中使用prototype.js,那么库会扩展Objects原型并添加一些其他内容,例如:

// the code is not exactly like this but that doesnt matter
Object.prototype.inspect = function...

当我创建一些对象时,该对象从来没有自己的属性“inspect”,这当然是正确的:

// false
{}.hasOwnProperty('inspect');

如果我像这样创建一个Object-literal,通过this object-literal创建的属性是ownproperties,当然也是正确的:

var myObj = {
   myProp: 'myVal'
};

// this would return true here
myObj.hasOwnProperty('myProp');

但是,如果我通过new运算符创建一个对象,甚至我的Function中的属性也不会被识别为ownproperty。

function MyTest () {}

MyTest.prototype.myProp = function () {};

var myObj = new MyTest();

// this would return false here

myObj.hasOwnProperty('myProp');

有人可以解释为什么会这样吗? 我想迭代一个对象,创建一个新对象,该对象只包含不属于Objects.prototype的属性(因此不是通过prototype.js创建的)。

编辑:我不是创建myObj的代码的所有者,我不知道哪个Function-Constructor创建了myObj

EDIT2:多亏了niko,这就是我现在的表现:

var key, newObj = {};
for (key in oldObj) {
  if (typeof newObj[key] == 'undefined') {
    newObj[key] = oldObj[key];
  }
}
for (key in newObj) {
  if (newObj.hasOwnProperty(key)) {
    // do some stuff here with properties that did not came from the objects.prototype
  }
}

2 个答案:

答案 0 :(得分:3)

hasOwnProperty的唯一目的是告诉附加到实际对象(也称为实例)的属性,而不是附加到原型的属性。如果通过new运算符构造实例,则新实例将链接到构造它的函数的原型 - 原型的属性不会复制到新实例!

考虑这样的事情来复制Object.prototype中没有的所有内容:

var newObj = {};
for (var key in oldObj) {
    if (typeof newObj[key] == 'undefined') {
        newObj[key] = oldObj[key];
    }
}

但是,仍然可以通过newObj访问Object.prototype的属性,因为它当然是Object的一个实例。

答案 1 :(得分:1)

因为它被分配给prototype,这实际上有点像为对象创建一个模糊的类或祖先,并赋予该属性。该属性从未直接分配给myObj

值得注意的是,您可以将原型直接应用于myObj而非其构造函数,或者在不调用原型的情况下将myProp直接应用于myTestmyProp仍然不会是myObj自己的财产。