Путать конструктор и прототип javascript? - PullRequest
6 голосов
/ 19 июля 2011
function MyObject(){}
Array.prototype={};
MyObject.prototype={};
var a=new Array();
var b=new MyObject();
alert(a.constructor==Array);//true
alert(b.constructor==MyObject);//false

Ответы [ 3 ]

9 голосов
/ 19 июля 2011

Array.prototype является записываемым свойством.

Таким образом, ваше назначение:

Array.prototype = {}

... не удается, поэтому его свойство .constructor не изменилось.

15.4.3.1 Array.prototype

Начальным значением Array.prototype является объект-прототип Array (15.4.4).

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

... тогда как с вашим пользовательским конструктором у вас есть возможность назначить другой объект-прототип, поэтому вы перезаписали оригинал, который имел ссылку на конструктор, через .constructor.

2 голосов
/ 19 июля 2011

Свойство constructor перезаписывается, когда вы переопределяете свойство prototype своим собственным пустым экземпляром объекта, начиная с ({}).constructor === Object.Вы можете сделать либо

function MyObject() {}
MyObject.prototype = {};
MyObject.prototype.constructor = MyObject;

, либо (лучше IMO) вы не можете установить prototype напрямую, но вместо этого увеличить его:

function MyObject() {}
MyObject.prototype.foo = "bar";

Также обратите внимание: Array.prototypeдоступный для записи, поэтому ваша строка Array.prototype = {} будет молча терпеть неудачу (или шумно терпеть неудачу в строгом режиме).

0 голосов
/ 19 июля 2011
> function MyObject(){} 
> Array.prototype={};

Вы не можете присвоить значение Array.prototype.

> MyObject.prototype={};
> var a=new Array();
> var b=new MyObject();
> alert(a.constructor==Array);//true

Array.prototype имеет свойство constructor , которое ссылается на Массив функция.Поскольку a является экземпляром Array , он наследует Array.prototype свойство конструктора.

> alert(b.constructor==MyObject);//false

Вы присвоили пустой объект MyObject.prototype , у него нет свойства prototype и b .

MyObject.prototype.constructor = MyObject;

alert(b.constructor==MyObject); // true
...