通过new创建的Javascript对象属性的所有权

Ownership of Javascript Object-Properties created via new

本文关键字:属性 所有权 对象 Javascript 创建 通过 new      更新时间:2023-09-26

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

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

当我创建一些对象时,该对象永远不会有自己的属性"inspect",这当然是正确的:

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

如果我像这样创建一个Object-literal,通过这个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');

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

编辑:我不是创建myObj的代码的所有者,我不知道哪个函数构造器创建myObj

多亏了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
  }
}

hasOwnProperty的唯一目的是将附加到实际对象(即实例)的属性与附加到原型的属性区分开来。如果你通过new操作符构造一个实例,这个新实例被链接到构造它的函数的原型——原型的属性不会被复制到新实例中!

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

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

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

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

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