我正在教自己来自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);
另外,这会破坏封装吗?上面的示例没有声明类中的变量,因此它们将是全局范围的。我了解原型如果被声明为firstName
和age
,将无法看到var firstName
或var age
。
我必须选择其中一个吗?我可以不使用我添加的原型和封装吗?
提前致谢!
答案 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
创建的每个对象实例,它将没有自己的实例,这使得创建多个成员更有效。