2012-02-16 5 views
1

Мне, вероятно, не хватает цели полностью, поэтому извиняюсь. Но Im задается вопросом, в чем разница между использованием «этого» и «прототипа» в этом контексте. И то, что я должен быть действительно использовать, чтобы построить богатые классы, многоразовые ...В чем разница между сохранением в прото и этим?

У меня есть это ...

function MyClass() { 

} 

MyClass.prototype.name = null; 

MyClass.prototype.init = function() { 

    console.log('init'); 

    MyClass.prototype.name = 'Peter set by proto'; 

    this.name = 'Peter set by this'; 

}; 

MyClass.prototype.SayName = function() { 

    console.log(MyClass.prototype.name); 
    console.log(this.name); 
}; 

А на странице ..

<script type="text/javascript"> 


     var myClass = new MyClass(); 
     myClass.init(); 
     myClass.SayName(); 

    </script> 

Выход есть ...

init 
Peter set by proto 
Peter set by this 

Так что же отличает между прото и этим, я думал, что они оба в основном получают доступ к объекту/классу ...?

ответ

0

Проще говоря, атрибут прототипа появится во всех объектах класса, а атрибут объекта просто принадлежит этому объекту.

вы установили:

MyClass.prototype.name = 'Peter set by prototype'; 

и вы console.log:

console.log(new MyClass().name); 
console.log(new MyClass().name); 
.... 

все они будут показывать "Петр установлен прототип.

и если вы установили:

var myClass = new MyClass(); 
myClass.name = "Peter set by object"; 

и вы console.log:

console.log(new MyClass().name); 
console.log(myClass.name); 
.... 

покажет:

Питер установлен прототип
Петр установлен объект

2

Когда вы присоединяете какие-либо методы или свойства через this к классу, тогда все экземпляры унаследованных дочерних классов также будут иметь эти свойства внутри них. С другой стороны, вы используете prototype, чтобы добавлять членов только к родительскому классу, и все же дочерние классы наследуют его, тем самым сохраняя память .

function Func(name){ 
    this.name = name; 

    this.display = function(){ 
    alert(this.name); 
    } 
} 

В приведенном выше случае, любой класс который наследует Func класс будет иметь display метод в своей подписи слишком который является излишним, если вы хотите, чтобы быть общими для всех других классов. Как наилучшая практика, вы должны добавлять только те элементы (через this) в родительский класс, которые не обязательно будут нужны дочерним классам.

Если вы хотите, член, который будет общим, а не добавлять его во все экземпляры дочерних классов, используйте prototype:

function Func(name){ 
    this.name = name; 
} 

Func.prototype.display = function(){ 
    alert(this.name); 
} 

// child class calling display 
function Child(name){ 
    Func.call(this, name); // this refers to Child class here 
} 

Child.prototype = new Func(); 
var cls2 = new Child('Johnson'); 
cls2.display(); // Johnson 

Как можно видеть display метод исходит из родительского Func класса и доступны в дочернем классе.

Смежные вопросы