通过新创建的Javascript对象属性的所有权
例如,如果我在我的应用程序中使用prototype.js,库会使用一些额外的东西扩展对象原型,例如:通过新创建的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'); 如果我像这样创建一个对象
// 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