试图了解新关键字

时间:2011-12-09 16:53:16

标签: javascript javascript-objects

我正在尝试准确理解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关键字构造。据我所知,new关键字只是执行函数并返回上下文。所以我想在上面的例子中,x和y本质上是单例,因为对原始函数的任何引用都会丢失?

除此之外,它们完全相同吗?如果没有差异,何时我想使用一种方法或避免另一种方法?

感谢您的任何解释。

1 个答案:

答案 0 :(得分:2)

  

我正在尝试准确理解javascript新关键字的含义

a = new X()意味着:

  • 创建新对象A
  • 将其原型设置为名为X.prototype的对象(所有函数都有一个“prototype”属性,它只是一个对象,您可以修改它以向使用此函数和new创建的对象添加行为),< / LI>
  • 使用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