定义一个类时,我想定义一个由所有实例对象共享的类级属性,我该如何定义它?
我可以想到2种方法:
在构造函数上定义
定义构造函数后,在构造函数本身上定义属性,
访问格式:
的 constructor_name.propName
定义原型
定义构造函数后,在构造函数的原型上定义属性,
这可能会被实例属性隐藏,
访问格式:
的 obj.propName
那么,哪种方法合适?还是有其他解决方案?
修改 我想知道这种情况当属性是字符串/数字,而不是函数。
答案 0 :(得分:1)
在prototype
上定义是正确的。
示例:
function Foo() {
this.name = 'Jone';
this.func1 = function() {
console.log('func1 print :' + this.name);
}
}
Foo.prototype.func2 = function() {
console.log('func2 print :' + this.name);
};
Foo.func3 = function() {
console.log('func3 print :' + this.name);
}
var f = new Foo();
f.func1(); // func1 print :Jone
f.func2(); // func2 print :Jone
f.func3(); // error, instace f cannot call func3.
func1 在构造函数中定义,实例可以调用它。
func2 在原型中定义,实例可以调用它。
func1 与 func2 之间的区别是 Foo 的所有实例共享func2 ,而每个实例< strong> Foo 有一个单独的func1 。
func3 无法通过 Foo 实例调用bcz func3 是 Foo 的属性<不是<的实例属性<强>富强>答案 1 :(得分:0)
经过一段时间的检查,我试着自己给出一个答案。
在构造函数上定义:
好的部分:它不会被具有相同名称的实例属性覆盖。
不好的部分:它不能直接通过实例访问,因为它不在原型链中,而是通过构造函数本身访问。
在原型上定义:
好的部分:它可以直接通过实例访问 坏部分:当实例定义具有相同名称的属性时,它可能被隐藏,并且它只读取实例,因为当实例尝试修改它时,它实际上创建了一个新的实例属性而不是修改一个来自原型。
所以,也许定义属性不是构造函数本身的函数更合适
并且,由于这个决定,为了保持同步,作为函数的类级属性最好也在构造函数本身上定义。
提示:在原型上定义的方法(由@isayme提到),应该被视为实例方法,而不是类级方法,即使它们是在原型上定义的,因为它们通常会读/写实例属性。 / p>