为什么这不起作用?
// this one works as I expected, when objSayHello()
Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
// NOT working !
Object.prototype ={objSayHello: function(){alert('Hello,from OBJECT prototype')}};
objSayHello();
答案 0 :(得分:6)
因为您已经替换了Object
原型,所以您要向objSayHello
(所有对象)的任何对象添加Object
方法。
请勿替换Object.prototype
。
你可能想要的是:
someObj.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
然后用:
来调用它someObj.objSayHello();
你似乎要做的是:
Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
但这可能是个坏主意,因为如果处理不当,它会与迭代器(for...in
)发生冲突。
答案 1 :(得分:2)
Object.prototype由于某种原因是一个const,意思是只读。
答案 2 :(得分:1)
Object.prototype.objSayHello = function(to){alert('Hello, ' + to)};
上述语句意味着您将objSayHello
函数附加到将创建的所有实例,因为每个实例都是Object
的子项,因此附加事件将绑定到所有实例。例如,
var newObject = {};
var anotherNewObject = new Object();
function person(name) {
this.name = name;
}
var newPerson = new Person("Ramiz");
newObject.objSayHello("newObject");
anotherNewObject.objSayHello("anotherNewObject");
newPerson.objSayHello(this.name);
然而,另一个语句是不正确的,并且将被完全忽略,因为您要丢弃作为所有父对象的prototype
对象。如果prototype
的{{1}}可以覆盖,则所有本机实例功能都将消失。为了避免这样的错误,我认为这是无视的覆盖。
答案 3 :(得分:1)
Eyelidlessness是错误的,你只需can't reassign the prototypes of intrinsic types喜欢对象,数字等。你只能添加新的属性。
> Number.prototype
-> Number
> Number.prototype = {} // Reassignment fails
-> Object
> Number.prototype
-> Number
> Number.prototype.objSayHello = 'hi' // Appending succeeds
-> 'hi'
> n = new Number(); n.objSayHello
-> 'hi'
如果您使用自己的对象,则可以更新或重新分配原型(注意:重新分配原型只会影响新对象,而不会影响现有对象。)
不要改变内在的原型!这是一件“坏事”,因为它可能导致难以发现的副作用。如果需要具有新属性的基本类型,则创建一个新对象,其中原型指向基本对象:
NewObject = function() {};
NewObject.prototype = Object.prototype;
NewObject.prototype.value = 123;
现在你有了一个构造函数来创建新对象,这些对象从它自己的原型(例如'value')以及Object原型('toString','hasOwnProperty'......)继承属性。
答案 4 :(得分:0)
Object.prototype实际上并不是真正的原型,它只是一个参考。内部[[prototype]]对象用作原型,并且在某些浏览器中可以作为对象的 proto 属性访问。鉴于JavaScript变量的工作方式,将Object.prototype分配给另一个对象会改变它的引用,但不会更改内部[[prototype]]对象,因此您将获得一个名为prototype的普通属性,该属性没有说明如何解析对象属性。
那么,为什么当你做Object.prototype.myFunction()时这会起作用? Object.prototype仍然是内部[[prototype]]的引用,因此使用此函数扩充它没有问题,它可以像任何其他对象一样工作。
答案 5 :(得分:0)
ECMAScript语言规范中有Object.prototype
的内容:
Object.prototype 的初始值为%Object.prototype%。
此属性的属性为{[[可写]]:错误,[[可枚举]]:错误,[[可配置]]:错误< / strong>}。
您会为所有其他本机JavaScript构造函数的prototype
属性(例如Function
,{}找到相同的“ [[Writable]]: false ”规范{1}},Number
,RegExp
等...