Javascript 为什么重新指定Object.prototype不起作用?
为什么这不起作用Javascript 为什么重新指定Object.prototype不起作用?,javascript,syntax,function,prototype,object,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')}}; objSayH
// 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();
对象
原型,所以您要将objSayHello
方法添加到从对象
下降的任何对象(所有对象)对象。原型
someObj.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
然后用以下方式来称呼它:
someObj.objSayHello();
你似乎想做的是:
Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
但这可能是个坏主意,因为如果处理不正确,它将与迭代器(for…in
)冲突
Object.prototype.objSayHello = function(to){alert('Hello, ' + to)};
对象
原型,所以您要将objSayHello
方法添加到从对象
下降的任何对象(所有对象)对象。原型
someObj.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
然后用以下方式来称呼它:
someObj.objSayHello();
你似乎想做的是:
Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
但这可能是个坏主意,因为如果处理不正确,它将与迭代器(for…in
)冲突
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);
然而,另一条语句是不正确的,当您将要放弃所有对象的父对象的原型时,它将被完全忽略。如果可以覆盖对象
的原型
,则所有本机实例功能都将消失。为了避免这样的错误,我认为这是一个被忽略的问题
上面的语句意味着您将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);
然而,另一条语句是不正确的,当您将要放弃所有对象的父对象的原型时,它将被完全忽略。如果可以覆盖对象
的原型
,则所有本机实例功能都将消失。为了避免这样的错误,我认为这是忽略被覆盖。Object.prototype出于某种原因是常量,这意味着只读。Object.prototype出于某种原因是常量,这意味着只读。Object.prototype实际上不是真正的原型,它只是一个参考。内部[[prototype]]对象用作原型,在某些浏览器中,它可以作为对象的proto属性访问。根据JavaScript变量的工作方式,将Object.prototype分配给另一个对象会更改它的引用,但不会更改内部[[prototype]]对象,因此您会得到一个名为prototype的普通属性,它不说明如何解析对象属性
那么,当您执行Object.prototype.myFunction()时,为什么这会起作用呢?Object.prototype仍然是内部[[prototype]]的参考,因此使用此功能对其进行扩展没有问题,它与任何其他对象一样工作。Object.prototype实际上不是真正的原型,它只是一个参考。内部[[prototype]]对象用作原型,在某些浏览器中,它可以作为对象的proto属性访问。根据JavaScript变量的工作方式,将Object.prototype分配给另一个对象会更改它的引用,但不会更改内部[[prototype]]对象,因此您会得到一个名为prototype的普通属性,它不说明如何解析对象属性
那么,当您执行Object.prototype.myFunction()时,为什么这会起作用呢?Object.prototype仍然是内部[[prototype]]的引用,因此使用此函数对其进行扩展没有问题,它与任何其他对象一样工作。无眼睑是错误的,您只需喜欢对象、数字等。您只能附加新属性
> 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;
现在,您有了一个构造函数,它可以创建新的对象,这些对象既继承自己的原型(例如“值”)的属性,也继承对象原型(例如“toString”、“hasOwnProperty”…)。这是错误的,您只是喜欢对象、数字等。您只能附加新属性
> 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”)的属性,也继承对象原型(例如“toString”、“hasOwnProperty”…)。ECMAScript语言规范有以下内容:
Object.prototype的初始值为%Object.prototype%
此属性具有属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false
您会发现所有其他本机JavaScript构造函数的原型
属性都有相同的“[[Writable]]:false”规范,例如函数
,编号
,RegExp
,日期
,…等等。ECMAScript语言规范有以下内容:
Object.prototype的初始值