[英]Revealing prototype pattern doesn't work with Array
它在我写作时起作用 ( http://jsfiddle.net/XJwvP/ ):
var Person = function(name) { this.name = name; }
Person.prototype = function () {
var sayHello = function (name) {
alert("Hello, " + name);
};
return {
sayHello: sayHello
};
}();
var person = new Person("Max");
person.sayHello("James");
我写的时候它不起作用 ( http://jsfiddle.net/ZKd4R/ ):
Array.prototype = function () {
var sayHello = function (name) {
alert("Hello, " + name);
};
return {
sayHello: sayHello
};
}();
var array = new Array();
array.sayHello("James");
错误 :
Uncaught TypeError: Object [object Array] has no method 'sayHello'
为什么我不能对Array对象使用相同的方法?
像你一样替换Array.prototype
不会影响新的Array
实例,因为Array
构造函数在语言中是特殊的(它是一个内置的构造函数 )。 规范在15.4.2.1中说:
新构造对象的[[Prototype]]内部属性设置为原始Array原型对象,即Array.prototype ( 15.4.3.1 )的初始值。
如果你检查15.4.3.1 ,你会注意到Array.prototype
也不是[[Writable]]。 我刚刚在Chrome控制台测试过:
var ap = Array.prototype;
Array.prototype = {};
ap == Array.prototype; // true
@bfavaretto已经解释了为什么它不起作用。 以下是您应该使用的模式来避免此类问题:
function Person(name) { this.name = name; }
(function(proto) {
function sayHello(name) {
alert("Hello, " + name);
}
proto.sayHello = sayHello;
}(Person.prototype));
var person = new Person("Max");
person.sayHello("James");
(function(proto) {
function sayHello(name) {
alert("Hello, " + name);
}
proto.sayHello = sayHello;
}(Array.prototype));
var array = []; // or `new Array();`
array.sayHello("James");
我们称之为mixin原型模式:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.