2011-12-09 43 views
2

我想了解JavaScript新关键字到底是什么意思,为什么它是必要的,当我应该使用它。试图了解新的关键字

考虑以下示例:

 var x = new function(){ 
     var self=this; 
     this.myFunction = function(){alert('foo ' + self.v)} 
     this.v='x'; 
     }; 

     var y = function(){ 
     var self=this; 
     this.myFunction = function(){alert('foo ' + self.v)} 
     this.v='y'; 
     return this; 
     }(); 


     var f=function(){ 
     var self=this; 
     this.myFunction = function(){alert('foo ' + self.v)} 
     this.v='z'; 
     } 

     var z = new f(); 

     x.myFunction(); 
     y.myFunction(); 
     z.myFunction(); 

x,y和z是所有对象。可能与公共和私人成员变量。

x和z在哪里使用new关键字构造。据我所知,新关键字只是执行该函数并返回上下文。所以我猜在上面的例子中,x和y基本上是单例,因为对原始函数的任何引用都会丢失?

除此之外,它们都完全相同吗?如果不是什么区别,我什么时候想要使用一种方法或避免另一种方法?

感谢您的任何解释。

+3

在呼叫设定时的 “Y”,'this'将是全球范围内('window'在浏览器中做)。要更类似于“x”,第一行应该是'var self = {};'真的,它应该返回“self”而不是“this”。 – Pointy

回答

2

我想确切地了解JavaScript的新关键字意味着

a = new X()意思是这样的:

  • 创建新对象
  • 设置它的原型称为对象X.prototype(所有函数都有一个“prototype”属性,它只是一个对象,您可以修改它以向使用此函数创建的对象添加行为,new),
  • 使用this = a调用X来初始化对象。

这是类似的:

a = Object.create(/* prototype */ X.prototype, {}); 
a.constructor = X; /* magic property which can be read after */ 
X.apply(/* this */ a, /* args */[]); 

为什么它是必要的,当我应该使用它。

这不是,你也不必。 Object.create与基于JS原型的对象模型更自然地结合起来,可以创建任意的原型链。

new使用,它的使用是这样的:

function Class(constructor_args) { 
    // init an object 
    this.a = 10; 
}; 
Class.prototype.method1 = function() { 
    console.log(this.a); 
} 
var obj = new Class(); 

然后创建使用new Class()一个对象后,它的原型是指含有它的方法,而对象本身包含字段对象Class.prototype

(个人观点:引入关键字new是为了更容易在Javascript中编写类似Java/C++和经典非原型对象模型的代码。)

Plase阅读这些优秀的文章:

Classical inheritance in Javascript

Prototypal inheritance

+0

谢谢,这清除了我脑海中的一些东西 – Chris