2

Рассмотрим следующий фрагмент кода:конструктор свойство объекта-прототипа

function Dog(){this.tail = true;} 
var benji = new Dog(); 
var rusty = new Dog(); 
Dog.prototype.say = function(){return 'Woof!';} 
alert(benji.say()); // this alerts woof! 
alert(rusty.say()); // this alerts woof! 
alert(benji.constructor.prototype.constructor); // THIS ALERTS THE DOG FUNCTION 
alert(typeof benji.constructor.prototype.tail) // THIS ALERTS UNDEFINED 

Почему функцию benji.constructor.prototype.constructoralert с собакой? Не должен ли быть конструктор Object()?

+0

'benji.constructor == Собака' только потому, что' Dog.prototype.constructor = Dog' – Bergi

+0

tail - это конкретный экземпляр экземпляра и говорит, что это прототип (общий) член, больше о прототипе и функциях конструктора здесь: http://stackoverflow.com/a/16063711/1641941 – HMR

ответ

1

Это просто:

+-----------------+  tail 
|     |-----------------> [true] 
|  benji  | 
|     | 
+-----------------+ 
     | 
     | __proto__ 
     | 
     v 
+-----------------+ constructor +-----------------+ 
|     |------------------>|     | 
| Dog.prototype |     |  Dog  | 
|     |<------------------|     | 
+-----------------+  prototype  +-----------------+ 
     | 
     | __proto__ 
     | 
     v 
+-----------------+ constructor +-----------------+ 
|     |------------------>|     | 
| Object.prototype|     |  Object  | 
|     |<------------------|     | 
+-----------------+  prototype  +-----------------+ 
  1. benji.constructor является Dog.
  2. benji.constructor.prototype является Dog.prototype.
  3. benji.constructor.prototype.constructor является Dog.
  4. benji.constructor.prototype.constructor.prototype является Dog.prototype.
  5. benji.constructor.prototype.constructor.prototype.constructor является Dog.

Это продолжается вечно. Вместо того, что вы хотите Object.getPrototypeOf:

  1. Object.getPrototypeOf(benji).constructor является Dog.
  2. Object.getPrototypeOf(Object.getPrototypeOf(benji)).constructor является Object.

С Object.getPrototypeOf итеративно вы можете создать специальную функцию для этого:

function getPrototypeOf(n, object) { 
    if (n === 0) return object; 
    else return getPrototypeOf(n - 1, Object.getPrototypeOf(object)); 
} 

Теперь вы можете использовать его следующим образом:

getPrototypeOf(1, benji).constructor; // Dog 
getPrototypeOf(2, benji).constructor; // Object 

Это все люди.

+0

Помогает много! Благодаря! – newbie

1

benji.constructor разрешает Dog. Отметьте, что benji на самом деле не имеет собственного constructor: наследует имущество constructor от своего прототипа. benji.constructor действительно Dog.prototype.constructor, как benji.say действительно Dog.prototype.say.

Таким образом, benji.constructor.prototype фактически является Dog.prototype, который является прототипом, где benji наследует прототипные свойства.

И, наконец, benji.constructor.prototype.constructor действительно Dog.prototype.constructor, что аналогично benji.constructor.

В отличие от этого benjiимеет свою собственность tail. Это устанавливается непосредственно на экземпляр, когда он сконструирован, и он не унаследован от прототипа.

0

Это потому, что прототип Dog не содержит указанного объекта. Вместо этого вы устанавливаете его для каждого нового экземпляра внутри функции конструктора. Для того, чтобы иметь tail в прототипе, вы должны определить его там:

Dog.prototype.tail = true; 
Смежные вопросы