2012-02-16 65 views
1

我很可能在这里完全没有提到这一点,所以很抱歉。但是我想知道在这种情况下使用'this'和'prototype'的区别是什么。而我确实应该使用来构建丰富的类,可重复使用...保存在proto和这个之间有什么区别?

我有这个...

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类和可用的子类。

相关问题