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

What is the difference between storing in proto and this?

本文关键字:之间 什么 区别 proto 存储      更新时间:2023-09-26

我可能完全没有抓住要点,所以很抱歉。但我想知道在这种情况下使用"this"answers"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和this之间有什么区别?我认为它们基本上都访问对象/类。。。?

当您通过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类,在子类中可用。

Simplly put,prototype的属性将出现在类的所有对象中,而对象的属性恰好属于该对象。

您设置:

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

和你控制台。log:

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

他们都会展示"彼得的原型"。

如果你设置:

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

和你控制台。log:

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

将显示:

Peter由原型设定
对象设置的Peter