我可能完全忽略了这一点,所以道歉。但我想知道在这种情况下使用'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和我之间的区别是什么?我认为它们基本上都可以访问对象/类......?
答案 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);
....
会显示:
彼得由原型设定 彼得按对象设置