вопрос про прототип в javascript - PullRequest
0 голосов
/ 23 марта 2011
<script>  
function ClassA()  
{  
    this.a=function(){alert();};  
}  
function ClassB()  
{  
    this.b=function(){alert();};  
}  
ClassB.prototype=new ClassA();  
var objB1=new ClassB();  
var objB2=new ClassB();  
alert(objB1.a==objB2.a);  
alert(objB1.b==objB2.b);  
</script>

Почему первое предупреждение верно, а второе ложно?Спасибо

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Поскольку атрибут "a" не является прямым свойством экземпляров ClassB (то есть objB1.hasOwnProperty ("a") имеет значение false), свойство читается из его прототипа. Поскольку существует только один объект-прототип для всех экземпляров ClassB, objB1.a и objB2.a буквально ссылаются на одну и ту же функцию, определенную в их общем объекте-прототипе. (Вы можете проверить, что objB1.a===objB2.a).

Но атрибут "b" определен как новая функция для каждого экземпляра ClassB, и отдельные экземпляры функции не равны друг другу.

0 голосов
/ 23 марта 2011

Upvoted @ maerics (хороший) ответ, но хочу указать на то, что может быть неочевидным.Внутри функции (конструктора) this относится к создаваемому новому экземпляру.Таким образом, каждый раз, когда вызывается new ClassA или new ClassB, создается новый экземпляр, а this.a или this.b ссылается на новую функцию, назначенную свойству вновь созданного объекта.

Итак,Глядя на ваш код, вы можете задать себе простой вопрос: «Сколько новых экземпляров каждого типа создается?»

Я вижу только одно вхождение new ClassA(), что означает просто one экземпляр ClassA создан, следовательно, this.a назначена только одна функция.Но я вижу два вхождения new ClassB(), поэтому две новые функции создаются, по одной для каждого экземпляра.

...