繁体   English   中英

显示原型模式不适用于Array

[英]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.prototype15.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM