目前我正在开发一个我们正在编写面向对象的JavaScript的项目。在这个项目中,我看到了两种不同的定义类的方法:
1:在原型上立即声明函数
My.Namespace.ClassName = function(param1, param2) {
this.member1 = param1;
this.member2 = param2;
};
My.Namespace.ClassName.prototype = {
myFunction1: function() {
return this.member1 + " " + this.member2;
},
myFunction2: function(param1) {
this.member3 = paraml;
}
};
2:在原型上准备每个功能个体
My.Namespace.ClassName = function(param1, param2) {
this.member1 = param1;
this.member2 = param2;
};
My.Namespace.ClassName.prototype.myFunction1 = function() {
return this.member1 + " " + this.member2;
};
My.Namespace.ClassName.prototype.myFunction2 = function(param1) {
this.member3 = paraml;
};
基于两个给定的示例,JavaScript的行为方式有什么不同,还是仅仅是样式差异?
就我个人而言,我没有看到任何行为差异,但我觉得必须有一个微妙的差异,我目前缺少。
除此之外。我想知道这是一种常见做法,还是有更好的方法来定义类。
答案 0 :(得分:8)
有一个微妙的区别。在第一种方法中,当你覆盖原型时,那里有一个现在丢失的属性。这是constructor
,它指向你的功能。构造函数允许您重新创建它的对象类型。
您可以轻松取回它,因此请手动设置第一种方法:
My.Namespace.ClassName.prototype = {
myFunction1: function() {
return this.member1 + " " + this.member2;
},
myFunction2: function(param1) {
this.member3 = paraml;
},
constructor: My.Namespace.ClassName
};
另请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor