JavaScript:原型是静态的同义词吗?
我正在自学来自OOP背景的JavaScript。我正在学习的那本书让我想,“哇,属性几乎和静态方法或变量一样!”如果是这样的话,我想更多地实现它们以节省内存,但在我爱上它们之前,我想确保我正确地使用它们 是这样吗?我的逻辑错了吗?我在下面添加一些示例代码,作为我的问题的上下文。希望它不会过于简单化:JavaScript:原型是静态的同义词吗?,javascript,Javascript,我正在自学来自OOP背景的JavaScript。我正在学习的那本书让我想,“哇,属性几乎和静态方法或变量一样!”如果是这样的话,我想更多地实现它们以节省内存,但在我爱上它们之前,我想确保我正确地使用它们 是这样吗?我的逻辑错了吗?我在下面添加一些示例代码,作为我的问题的上下文。希望它不会过于简单化: function person(first, age){ this.firstName = first; this.age = age; } person.prototype.sa
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);
还有,这会破坏封装吗?上面的示例没有声明类中的变量,因此它们将被全局限定范围。我理解,如果声明var-firstName
和var-age
,原型将无法看到firstName
或age
我必须选一个还是另一个?我可以不使用我添加的原型和封装吗
提前谢谢
JavaScript
不是一种真正的面向对象语言,因此没有真正的封装。您有闭包
。您的方法可以从闭包中获益,并访问仅在person函数的作用域中定义的变量,因此您可以将它们称为private
。但是,您不能从原型
上定义的方法访问这些变量,因为它不再是相同的范围
同样,原型也不是静态的同义词
关于原型
的主要内容是,原型上定义的对象和方法为新
生成的对象
的每个实例提供这些对象和方法的相同实例。这意味着,如果在原型
上而不是通过功能范围定义方法或对象,则对于使用新建
创建的每个对象实例,该方法或对象将没有自己的实例,这使得创建多个成员更加高效
原型是静态的同义词吗
否。原型上的属性是实例属性。如果将方法附加到函数的原型,则从该函数创建的实例将继承该原型。这意味着从该函数创建的所有实例将在原型上共享该方法的一个副本
JavaScript中的“静态”属性最好通过直接在构造函数本身上的属性来表示:
function Person() {}
Person.count = 0;
这里,count
是构造函数上的“静态”属性。您可以使用Person.count++
在构造函数中更新该值
上面的示例没有声明类中的变量,因此它们将被全局限定范围
您没有任何变量声明,只有属性赋值。因为原型方法将在实例的上下文中调用,所以该将引用该实例,因此原型方法可以访问这些实例属性
在您的示例中,唯一“全局”的是person
构造函数本身。谢谢James,这完全是深入的,而且很容易理解。我真的很感激<代码>原型更像是类< /C> >而不是<代码> static 。说JavaScript不是真正的OO语言,因为它没有类就像说C++不是真正的OO语言,因为它没有原型或委托。OO的类型不止一种。有从Modula派生的语言(基于类)和从Self派生的语言(基于原型),我想他是想说:JavaScript不像Java