gpt4 book ai didi

javascript - 原型(prototype)和命名空间之间的区别

转载 作者:行者123 更新时间:2023-11-30 06:59:19 24 4
gpt4 key购买 nike

在命名空间中我们可以使用这样的东西:

var namespace = {};
namespace.something.nested.namespacing();

并且在原型(prototype)中我们也可以使用相同的命名空间:

something.prototype.method();

在这两种类型中,我们都使用 。符号。那么,我们如何判断代码使用的是命名空间还是原型(prototype)呢?

最佳答案

JavaScript 没有 namespace 。您所说的 namespace 只是一个对象。使用对象来代表命名空间是相当普遍的。

您的代码:

var namespace = {};
namespace.something.nested.namespacing();

...创建一个对象 和一个引用该对象的变量,称为命名空间。然后向该对象添加属性(看起来您已经添加了一个属性 something,它也是一个对象,它有一个属性 nested,它是 < em>也是一个对象,它有一个名为 namespacing 的属性,它指的是一个函数)。

您的代码:

something.prototype.method();

...也在使用一个对象。上面实际上是一件非常不寻常的事情,你通过直接引用我假设的函数的 prototype 属性来调用函数(method)( 某事)。这通常不是你会做的。通常你会通过函数创建一个对象:

var s = new something();

...然后使用隐式分配给 s 的原型(prototype):

s.method();

函数的 prototype 属性可能会让刚接触 JavaScript 的人感到困惑。它只是一个普通属性,就像函数实例上的任何其他属性一样。唯一让它与众不同的是 new 运算符:当您通过 new 调用函数时:

var s = new something();

...JavaScript 引擎创建一个新的空白对象,然后使用 something.prototype 设置其底层原型(prototype)(有时称为 __proto__ 但[尚未]在规范中) ,像这样:

// pseudo-code for `var s = new something()`
var tmp = {}; // New, blank object
tmp.__proto__ = something.prototype; // Assign a prototype to the new object
something.call(tmp); // Call `something` with `this` referring to `tmp`
s = tmp; // Assign the result to `s`

(为了避免混淆,我在上面遗漏了一个细节,用于处理 something 中有显式 return 语句的特殊情况返回一个对象引用。)

关于javascript - 原型(prototype)和命名空间之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21400276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com