2015-05-01 79 views
1

我正在从头First Javascript(Morrison),学习JavaScript。Javascript类/静态变量

举一个例子,笔者声明一个变量,“签名”是一类被称为博客的类属性通过执行以下操作:上面并宣布之间

Blog.prototype.signature = "by Blogger-Name"; 

是否有差异是怎么样我有以下?

Blog.signature = "by Blogger-Name"; 
+0

@vinayakj这不是因为我的问题不是关于函数是否被引用或复制。 – rickyspanish

+0

@vinayakj我确实经历过这个帖子,没有看到我的答案。如果您仍然认为我的问题在那里得到解答,请更具体一些。 – rickyspanish

+0

@vinayakj虽然你已经回答了我的问题,但你提到我的帖子却没有。那我就把它留下。 – rickyspanish

回答

3

Blog所有情况下,您使用.prototype将有签名。所以当你实例化var blog = new Blog。它将有一个signature property

如果你只是使用Blog.signature = x然后当你创建一个对象new它不会在那里。

+0

是的,但所有实例都可以通过Blog.signature访问签名属性。那么通过.prototype声明属性的意义是什么呢? – rickyspanish

+0

如果您同时使用这两种方法,那么您可以以任何方式访问它,但是如果您选择使用.prototype,那么您可以将其视为一个类成员 –

+0

正确,但为什么要声明任何保持相同值的变量一个类的所有实例作为一个实例变量?你只会声明它是一个类/静态变量......我应该改变我的问题在这一点上:有没有一种情况下,你会被要求声明一个变量使用。原型? – rickyspanish

1

设置构造函数的prototype成员的属性使该属性在所有实例中都可见(读取时)。

这可以用来模拟C++类的static成员,并且通常用Javascript表单方法完成(因为方法确实只是常规数据成员,与C++不同)。

一个例子,其中这可以代替用于“数据”是保持一定的“类”的所有实例的容器:

function Widget(x0, y0, x1, y1, name) { 
    this.x0 = x0; 
    this.y0 = y0; 
    this.x1 = x1; 
    this.y1 = y1; 
    this.name = name; 
    this.all_instances.push(this); 
} 

Widget.prototype.all_instances = []; 

var w1 = new Widget(10, 20, 30, 40, "First"); 
var w2 = new Widget(10, 20, 30, 40, "Second"); 

注意,但是写这样的“静态”的属性,当你'重新创建一个实例属性; push的作品,因为它不写入.all_instances,但修改其内容(数组)。