在proto和这个存储之间有什么区别?

时间:2012-02-16 11:52:23

标签: javascript

我可能完全忽略了这一点,所以道歉。但我想知道在这种情况下使用'this'和'prototype'之间的区别是什么。而我应该用它来构建可重用的丰富类......

我有这个......

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

那么proto和我之间的区别是什么?我认为它们基本上都可以访问对象/类......?

2 个答案:

答案 0 :(得分: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类,并且可以在子类中使用。

答案 1 :(得分: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);
....

会显示:

彼得由原型设定 彼得按对象设置