什么时候应该在javascript中的对象扩充期间使用"原型"?

Tra*_*vis 5 javascript oop prototype

我对javascript中"原型"的概念感到困惑.

当我定义一个对象时,以下两个似乎都有效:

myObject = {};
myObject.prototype.method1 = function() { ... };
myObject.prototype.method2 = function() { ... };
myObject.prototype.method3 = function() { ... };
Run Code Online (Sandbox Code Playgroud)

和...

myObject = {};
myObject.method1 = function() { ... };
myObject.method2 = function() { ... };
myObject.method3 = function() { ... };
Run Code Online (Sandbox Code Playgroud)

谁能对此有所了解?这两种创建对象的方式究竟有什么区别,为什么我会选择另一种呢?(我觉得这种感觉很重要......)

谢谢!

CMS*_*CMS 8

您应该prototype仅在构造函数上使用该属性,而不是在对象实例中,例如:

function Test () {}
Test.prototype.method1 = function () {/*...*/};

var obj = new Test();
Run Code Online (Sandbox Code Playgroud)

prototype构造函数的属性由new运算符在创建新对象实例时使用.

所有本机对象都有一个隐藏的链接,用于构建原型链.

对象之间的这个隐藏链接是[[Prototype]]内部属性,new操作员是唯一可以设置它的人.

在上面的示例中,obj内部与它的构造函数原型相关联,method1可以从中访问obj,但它在物体上不存在,该方法存在于Test.prototype对象上,并通过原型链检索,例如:

typeof obj.method1; // "function"
obj.hasOwnProperty('method1'); // false
obj.method1 === Test.prototype.method1; // true
Run Code Online (Sandbox Code Playgroud)

在对象实例上,分配prototype属性是没有意义的,它将被视为与任何其他属性名称一样:

var myObject = {};
myObject.prototype = "foo";
myObject.bar = "bar";

// myObject is simply {"prototype":"foo","bar":"bar"}
Run Code Online (Sandbox Code Playgroud)