Javascript 原型和命名空间之间的差异

Javascript 原型和命名空间之间的差异,javascript,Javascript,在名称空间中,我们可以使用如下内容: var namespace = {}; namespace.something.nested.namespacing(); // pseudo-code for `var s = new something()` var tmp = {}; // New, blank object tmp.__proto__ = something.prototype; // Assign a prototype to the

在名称空间中,我们可以使用如下内容:

var namespace = {};
namespace.something.nested.namespacing();
// 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`
在prototype中,我们还可以使用与名称空间相同的名称:

something.prototype.method();

在这两种类型中,我们都使用
。符号
。那么,我们如何确定代码使用的是名称空间还是原型?

符号是javascript中用于访问任何对象的任何属性的非常通用的工具

var x = {};
x.val = 2;
您对名称空间的引用在javascript中只是一个通用对象,因为javascript中没有实际的名称空间类型。换句话说,普通对象用于在javascript中创建类似名称空间的东西。因此,对象属性用于跟踪命名空间中的名称



符号用于原型是访问特定类型对象(原型)属性的一个特定实例。原型用于函数对象,在创建该函数的新实例时有非常特殊的用途

function foo() {
}

foo.prototype.talk = function() {
    alert("hello");
}

var y = new foo();
y.talk();

符号是javascript中用于访问任何对象的任何属性的非常通用的工具

var x = {};
x.val = 2;
您对名称空间的引用在javascript中只是一个通用对象,因为javascript中没有实际的名称空间类型。换句话说,普通对象用于在javascript中创建类似名称空间的东西。因此,对象属性用于跟踪命名空间中的名称



符号用于原型是访问特定类型对象(原型)属性的一个特定实例。原型用于函数对象,在创建该函数的新实例时有非常特殊的用途

function foo() {
}

foo.prototype.talk = function() {
    alert("hello");
}

var y = new foo();
y.talk();

JavaScript没有名称空间。您所调用的名称空间只是一个对象。使用对象代替名称空间是很常见的

您的代码:

var namespace = {};
namespace.something.nested.namespacing();
something.prototype.method();
…创建一个对象和一个引用该对象的变量,该对象名为
名称空间
。然后向该对象添加属性(看起来您添加了一个属性,
something
,它也是一个对象,它有一个嵌套的属性,
,它也是一个对象,它有一个称为
名称空间的属性,它引用了一个函数)

您的代码:

var namespace = {};
namespace.something.nested.namespacing();
something.prototype.method();
…也在使用对象。上述操作实际上是非常不寻常的,您通过直接引用我假设的函数(
某物
)的
原型
属性来调用函数(
方法
)。你通常不会这么做。通常,您会通过以下函数创建一个对象:

var s = new something();
…然后隐式使用分配给
s
的原型:

s.method();
函数的
prototype
属性可能会让JavaScript新手感到困惑。它只是一个普通属性,就像任何其他属性一样,位于函数实例上。唯一让它与众不同的是
new
操作符:当您通过
new
调用函数时:

var s = new something();
…JavaScript引擎创建一个新的空白对象,然后使用
something.prototype
设置其基础原型(有时称为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

var namespace = {};
namespace.something.nested.namespacing();
// 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没有名称空间。您所调用的名称空间只是一个对象。使用对象代替名称空间是很常见的

您的代码:

var namespace = {};
namespace.something.nested.namespacing();
something.prototype.method();
…创建一个对象和一个引用该对象的变量,该对象名为
名称空间
。然后向该对象添加属性(看起来您添加了一个属性,
something
,它也是一个对象,它有一个嵌套的属性,
,它也是一个对象,它有一个称为
名称空间的属性,它引用了一个函数)

您的代码:

var namespace = {};
namespace.something.nested.namespacing();
something.prototype.method();
…也在使用对象。上述操作实际上是非常不寻常的,您通过直接引用我假设的函数(
某物
)的
原型
属性来调用函数(
方法
)。你通常不会这么做。通常,您会通过以下函数创建一个对象:

var s = new something();
…然后隐式使用分配给
s
的原型:

s.method();
函数的
prototype
属性可能会让JavaScript新手感到困惑。它只是一个普通属性,就像任何其他属性一样,位于函数实例上。唯一让它与众不同的是
new
操作符:当您通过
new
调用函数时:

var s = new something();
…JavaScript引擎创建一个新的空白对象,然后使用
something.prototype
设置其基础原型(有时称为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

var namespace = {};
namespace.something.nested.namespacing();
// 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
语句,返回一个对象引用。)

名称空间就是对象,原型对象就是对象,所以从语法的角度来看,访问它们的方式没有区别(
foo.bar
称为点符号()

然而,它们有两个根本不同的用途:

  • 名称空间用于构造代码并避免全局名称空间污染
  • 原型用于在同一构造函数的多个实例之间共享方法
因此,通常不直接在原型上调用方法,因为它很可能不起作用。此方法的目的是在相应构造函数的实例上调用。例如:

function Something() {}
Something.prototype.foo = function() {};

var s = new Something();
s.foo();

名称空间就是对象,原型对象就是对象,所以从synt