例如,如果我在我的应用程序中使用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
}
}
答案 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
直接应用于myTest
,myProp
仍然不会是myObj
自己的财产。