Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:原型是静态的同义词吗?_Javascript - Fatal编程技术网

JavaScript:原型是静态的同义词吗?

JavaScript:原型是静态的同义词吗?,javascript,Javascript,我正在自学来自OOP背景的JavaScript。我正在学习的那本书让我想,“哇,属性几乎和静态方法或变量一样!”如果是这样的话,我想更多地实现它们以节省内存,但在我爱上它们之前,我想确保我正确地使用它们 是这样吗?我的逻辑错了吗?我在下面添加一些示例代码,作为我的问题的上下文。希望它不会过于简单化: function person(first, age){ this.firstName = first; this.age = age; } person.prototype.sa

我正在自学来自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);
还有,这会破坏封装吗?上面的示例没有声明类中的变量,因此它们将被全局限定范围。我理解,如果声明
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