1

它在我写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 对象使用相同的方法?

4

2 回答 2

3

像你一样替换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
于 2013-09-19T21:59:49.143 回答
1

@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");

让我们称之为混合原型模式:-)

于 2013-09-19T22:13:14.783 回答