JavaScript:Prototype是静态的同义词吗?

时间:2015-04-24 16:02:45

标签: javascript

我正在教自己来自OOP背景的JavaScript。我正在研究的这本书让我想到了,哇,属性几乎和静态方法或变量一样!"如果是这种情况,我希望更多地实现它们以节省一些记忆,但在我爱上它们之前,我想确保我正确地使用它们。

这是这样的吗?我的逻辑错了吗?我在下面添加一些示例代码作为我的问题的上下文。希望它不会过于简单:

function person(first, age){
    this.firstName = first;
    this.age = age;
}

person.prototype.sayHello = function(){
    return "hi my name is " + this.firstName + " and I am " + age + ".";
};

因此可以通过以下方式调用构造函数

var me = new person("Dan", 22);

另外,这会破坏封装吗?上面的示例没有声明类中的变量,因此它们将是全局范围的。我了解原型如果被声明为firstNameage,将无法看到var firstNamevar age

我必须选择其中一个吗?我可以不使用我添加的原型和封装吗?

提前致谢!

2 个答案:

答案 0 :(得分:4)

  

Prototype是否与Static同义?

没有。原型上的属性是实例属性。如果将方法附加到函数的原型,则从该函数创建的实例将从该原型继承。这意味着从该函数创建的所有实例将在原型上共享该方法的单个副本。

JavaScript中的'static'属性最好由构造函数本身上的属性表示:

function Person() {}
Person.count = 0;

这里,count是构造函数的'static'属性。你可以从例如更新在Person.count++;

的构造函数中
  

上面的示例没有声明类中的变量,因此它们将是全局范围的

您没有任何变量声明,只有属性赋值。因为将在实例this的上下文中调用prototype方法,所以将引用该实例,因此prototype方法可以访问这些实例属性。

你的例子中唯一的'全局'是person构造函数本身。

答案 1 :(得分:2)

$('body').on('click', '.list-group li a:not(.open)', function() { // .... } 并不是一种面向对象的语言,所以你没有真正的封装。你有JavaScript。您的方法可以从闭包中受益并访问仅在您的人员函数的closures中定义的变量,因此您可以将它们称为scope。但是,您无法从private上定义的方法访问这些变量,因为它不再是prototype

原型与静态不同,如here所述。

scope的主要内容是原型上定义的对象和方法为prototype生成的object的每个实例提供了这些对象和方法的相同实例。这意味着如果在new而不是通过函数作用域定义了方法或对象,则对于使用prototype创建的每个对象实例,它将没有自己的实例,这使得创建多个成员更有效。