2017-07-25 79 views
0

好吧,所以我一直在阅读https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new 并发现自己在一类方案中编写了一堆对象构造代码。JavaScript的新对象构造函数替代适当?

为了保持向后兼容性,我一直没有使用'class'关键字/语法。

你可能已经看到了这一点之前:

function Car(make, model, year) { 
    this.make = make; 
    this.model = model; 
    this.year = year; 
} 
//Usage: var carinstance = new Car("blah","blah","blah"); 

但我发现这工作得很好我使用(偶然发现):

function Player (name) { 
    var p = { 
     name : name, 
     age : 18 
    }; 
    return p; 
} 
//Usage: var person = new Player("Jon"); 

我知道它的工作原理 ,因为我用过它。 我只是不知道这是否正确。

例如,我可以使用相同的码的w/o“新”的关键字(相同的结果):

var person = Player("Jon"); 

但我不能做同样的与所述第一规格(使用“这个”的关键字一个函数):

var car = Car("blah","blah","blah"); //car == undefined 

我真的不知道如何谷歌这个,或者叫什么。我很努力想弄清楚这个问题应该具备什么样的标题。

我想一个更明确的方式来提出这个问题: 我得到的结果只是一个JavaScript,浏览器引擎的夸克?或者,这是一个构建函数的可靠方法吗?

+2

你的第一个方法是使用构造函数。在第二种方法中,您正在返回一个对象,但它不使用构造函数。当你开始使用'prototype'时,1个主要区别将会起作用。使用'new'创建的对象将具有您定义的原型,而另一个将只具有默认原型 – Rajesh

+1

是的,这是''this'在JavaScript中的工作原理。不隶属于下面的渠道,但是这些是了解这里发生的事情的很好的资源! [The new keyword](https://www.youtube.com/watch?v=Y3zzCY62NYc) .... [“this&Object Prototypes”](https://github.com/getify/You-Dont-Know-JS/blob/master/this%20&%20object%20prototypes/README.md#you-dont-know- JS-此 - 对象的原型) – dpaulus

回答

1

因为在Player函数中,它返回p对象。因此,如果您使用new运算符调用Player函数,它将是p对象,但不是默认创建的obj。当然,当您通常调用Player时,它也将返回p对象。但是,在Car函数中,它不会返回一个对象。因此,当您使用new操作符调用Car函数时,它将返回默认创建的对象,它将返回undefined,通常调用Car函数。

你可以参考:当你正在使用`this`,你将不得不使用`new`或`Object.create`创建对象

usage of new operator

1

请执行以下操作。

function Car(make, model, year) { 
    if (!(this instanceof Car)) 
     return new Car(make, model, year); 
    this.make = make; 
    this.model = model; 
    this.year = year; 
} 

然后你可以没有新的称呼它。