2

例如,如果我在我的应用程序中使用prototype.js,该库会使用一些额外的东西扩展对象原型,例如:

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

当我创建一些对象时,该对象永远不会拥有自己的属性“检查”,这当然是正确的:

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

如果我像这样创建一个对象文字,通过这个对象文字创建的属性是自己的属性,这当然也是正确的:

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
  }
}
4

2 回答 2

3

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

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

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

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

于 2013-02-26T14:26:05.550 回答
1

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

值得注意的是,您可以将原型直接应用于myObj而不是其构造函数,或者myProp直接应用于myTest而不调用原型,并且myProp仍然不是myObj自己的属性。

于 2013-02-26T14:26:13.610 回答