javascript - 类级属性

时间:2014-07-08 04:55:46

标签: javascript constructor prototype

定义一个类时,我想定义一个由所有实例对象共享的类级属性,我该如何定义它?
我可以想到2种方法:

  • 在构造函数上定义

    定义构造函数后,在构造函数本身上定义属性,
    访问格式:
    constructor_name.propName

  • 定义原型

    定义构造函数后,在构造函数的原型上定义属性,
    这可能会被实例属性隐藏,
    访问格式:
    obj.propName

那么,哪种方法合适?还是有其他解决方案?

修改 我想知道这种情况当属性是字符串/数字,而不是函数。

2 个答案:

答案 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>