Javascript:是否存在一种情况,人们更愿意使用原型(prototype)来声明对象属性?

标签 javascript

我刚刚开始学习 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/

相关文章:

javascript - 如何使用 Chai.should 测试抛出的错误

javascript - 查找 ng 重复中选择的选项

javascript - Vue.js - 双花括号( mustache )语法不起作用/渲染到页面

javascript - 如何制作node js在线视频流

javascript - 将数据标签调整到特定位置(HIGHCHARTS)

javascript 我想做矩减法或差异

javascript - 用 div 标签包裹 iframe 标签

javascript - 将对象推送到 observableArray

javascript - 单击 onClick() 事件后如何禁用 scrollTop() 效果

javascript - 使用 DirectoryIterator 将图像从脚本加载到 Flexbox 中