我刚刚开始学习 JavaScript。
根据我到目前为止的理解,您可以通过两种方式声明类/静态变量。第一种方式:
Blog.prototype.signature = "By Blogger-Name";
第二种方式:
Blog.signature = "By Blogger-Name";
通过使用第一种方法,变量签名可用于 Blog 的所有实例。
但是,对于类的所有实例都保持相同值的变量实际上不应该是实例变量。在我看来,类/静态变量应该仅使用第二种方法来声明。
因此,我的问题是,是否存在需要/强制以第一种方式声明变量的情况?还是我对这一切的理解有任何欠缺?请告诉我。
编辑:在什么情况下首选第一种方法,同样,在什么情况下首选第二种方法?
编辑2:所以我了解到第一个方法实际上添加了具有默认值的实例属性。这也可以通过在构造函数本身中设置默认值来实现。那么什么时候会首选以这种方式(即使用原型(prototype))添加属性?
最佳答案
Hence, my question is, is there a scenario where one would be required/forced to declare variables the first way?
唯一想到的是,您是否需要允许代码使用通过 new Blog
创建的对象来访问属性,而无需知道构造函数的名称。例如:
function useABlogInstance(blog) {
// Here, assume I don't know that `blog` was created via `new Blog`
console.log(blog.signature);
}
尽管精明的用户可以做到
console.log(blog.constructor.signature);
访问Blog.signature
(假设您维护构造函数
反向链接),这不会很干净。 :-)
需要注意的是 Blog.prototype
上的属性不是“类”或“静态”属性,它是一个实例属性(在 >Blog.prototype
对象)。虽然从通过 new Blog
创建的对象读取该属性确实会在原型(prototype)上找到它(如果实例没有自己的签名
) code> 属性),写入属性的结果非常非常不同。考虑:
function A() {}
A.prototype.prop = "prototype prop";
var a1 = new A();
var a2 = new A();
snippet.log(a1.prop); // "prototype prop"
snippet.log(a2.prop); // "prototype prop"
a1.prop = "updated";
snippet.log(a1.prop); // "updated" -- because `a1` has its own `prop` property
// now and no longer uses the prototype's
snippet.log(a2.prop); // "prototype prop"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
对比一下:
function B() {}
B.prop = "B prop";
var b1 = new B();
var b2 = new B();
snippet.log(b1.constructor.prop); // "B prop"
snippet.log(b2.constructor.prop); // "B prop"
snippet.log(B.prop); // "B prop"
b1.constructor.prop = "updated";
snippet.log(b1.constructor.prop); // "updated"
snippet.log(b2.constructor.prop); // "updated"
snippet.log(B.prop); // "updated"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
对于“类”范围的信息,我总是使用 Blog.signature
,而不是 Blog.prototype.signature
。我将 Blog.prototype.signature
用于实例特定的 default 属性,其中值是基元或函数(但不是非函数对象或数组,我设置这些在构造函数中)。
旁注:您没有在任何一个代码片段中声明变量。您正在向对象添加属性。在第一个代码段中,您将属性添加到对象中,该对象将被指定为通过 new Blog
创建的对象的原型(prototype)。在第二种情况下,您要向 Blog
对象添加一个属性(函数是对象)。两者都不是变量,在这两种情况下它都是属性。
关于Javascript:是否存在一种情况,人们更愿意使用原型(prototype)来声明对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29984261/