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

通过新创建的Javascript对象属性的所有权,javascript,Javascript,例如,如果我在我的应用程序中使用prototype.js,库会使用一些额外的东西扩展对象原型,例如: // the code is not exactly like this but that doesnt matter Object.prototype.inspect = function... 当我创建某个对象时,该对象从来没有ownproperty“inspect”,这当然是正确的: // false {}.hasOwnProperty('inspect'); 如果我像这样创建一个对象

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

// the code is not exactly like this but that doesnt matter
Object.prototype.inspect = function...
当我创建某个对象时,该对象从来没有ownproperty“inspect”,这当然是正确的:

// false
{}.hasOwnProperty('inspect');
如果我像这样创建一个对象文字,那么通过该对象文字创建的属性就是ownproperties,这当然也是正确的:

var myObj = {
   myProp: 'myVal'
};

// this would return true here
myObj.hasOwnProperty('myProp');
但是,如果通过new操作符创建对象,即使函数中的属性也不会被识别为ownproperty

function MyTest () {}

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

var myObj = new MyTest();

// this would return false here

myObj.hasOwnProperty('myProp');
有人能解释为什么会这样吗? 我想迭代一个对象,创建一个新对象,它只包含不属于Objects.prototype的属性(因此不是通过prototype.js创建的)

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

编辑2:多亏了尼科,我现在就是这样做的:

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的实例。

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
自己的属性。

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


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

如果我理解您的意思正确,无法检查对象属性(假设对象是通过新操作符创建的)是否来自object.prototype或MyTest或任何类。prototype?至少我不知道一个解决方案比信号函数调用更简单。如果你真的需要这个,你必须有点创造性。这里肯定有一些非标准的东西可能会有所帮助(比如考虑
\uuuuu proto\uuuuu
属性)。迭代对象并将属性复制到新对象上确实解决了我的问题,谢谢!如果我理解你的意思是正确的,那么就不可能检查对象属性(假设对象是通过新操作符创建的)是否来自object.prototype或MyTest或任何类。prototype?至少我不知道有什么解决方案比信号函数调用更简单。如果你真的需要这个,你必须有点创造性。这里肯定有一些非标准的东西可能会有所帮助(比如考虑
\uuuuu proto\uuuuu
属性)。迭代对象并将属性复制到新对象上确实解决了我的问题,谢谢!谢谢你的回答,我不是创建myObj的代码的所有者,所以你回答的第2部分对我来说是不可能的-(.我会在我的问题中补充这一点,我想你只是好奇它是如何工作的-如果出于某种原因你想得到结果
myObj.hasOwnProperty('myProp'))===true
,只需直接重新指定:
myObj.myProp=myObj.myProp
。然后我需要知道myObj有属性myProp,这是我不知道的;-)我需要迭代,并动态检查哪些属性不是来自对象。原型谢谢你的回答,我不是创建myObj的代码的所有者,所以你回答的第二部分对我来说是不可能的-(.我会在我的问题中补充这一点,我想你只是好奇它是如何工作的-如果出于某种原因你想得到结果
myObj.hasOwnProperty('myProp'))===true
,只需直接重新指定它:
myObj.myProp=myObj.myProp
。然后我需要知道myObj具有属性myProp,这是我不知道的;-)我需要迭代,并动态检查哪些属性不是来自Object.prototype