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

时间:2010-02-16 07:09:45

标签: javascript oop prototype

我对javascript中“原型”的概念感到困惑。

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

myObject = {};
myObject.prototype.method1 = function() { ... };
myObject.prototype.method2 = function() { ... };
myObject.prototype.method3 = function() { ... };

和...

myObject = {};
myObject.method1 = function() { ... };
myObject.method2 = function() { ... };
myObject.method3 = function() { ... };

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

谢谢!

2 个答案:

答案 0 :(得分:8)

您应该仅在Constructor Functions使用prototype属性,而不是对象实例,例如:

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

var obj = new Test();

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

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

对象之间的隐藏链接是[[Prototype]]内部属性,new运算符是唯一可以设置它的人。

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

typeof obj.method1; // "function"
obj.hasOwnProperty('method1'); // false
obj.method1 === Test.prototype.method1; // true

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

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

// myObject is simply {"prototype":"foo","bar":"bar"}

答案 1 :(得分:1)

第二种方法仅为此对象添加方法。第一种方法使其可用于使用此“类型”new创建的其他对象。