为什么重新分配Object.prototype不起作用?

时间:2009-07-22 00:32:04

标签: javascript syntax function prototype object

为什么这不起作用?

// 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();

6 个答案:

答案 0 :(得分:6)

  1. 因为您已经替换了Object原型,所以您要向objSayHello(所有对象)的任何对象添加Object方法。

  2. 请勿替换Object.prototype

  3. 你可能想要的是:

    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}},NumberRegExp等...