2010-02-16 44 views
5

我对javascript中“原型”的概念感到困惑。什么时候应该在javascript中使用对象增强时使用“prototype”?

当我定义对象以下两个似乎工作:

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

和...

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

任何人都可以阐明这一些轻?这两种创建对象的方式究竟有什么不同?为什么我会选择一种对象? (我有这种感觉,在我的肠道中,这很重要...)

谢谢!当它创建了我们的新

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

var obj = new Test(); 

prototype的构造函数性质,由new运营商使用,:

回答

8

应该只在Constructor Functions对象实例使用prototype属性,而不是,例如对象实例。

所有本地对象都有一个隐藏链接,它构建了原型链。

对象之间的隐藏链接是[[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"} 
+0

会添加很多次,会有内部添加的方法,通过在构造函数内的每个实例:this.fn = function(){...};这对于有实例方法访问的私有实例变量很有用。 – Tracker1 2010-02-16 07:35:03

1

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

相关问题