在javascript

时间:2015-09-01 09:47:31

标签: javascript

我是javascript的新手;并且我正在挖掘'新'变量。

我的气氛是:

function Fruit(name)
{
this.name = name;
}

function myNew(con,args){
 var obj = {};
 obj = con.apply(obj,args) || obj;
 obj.constructor = con;
 return obj;
}

var f1 = new Fruit("Mango");
var f2 = myNew(Fruit,["Orange"]);

console.log(f1.name, f1 instanceof Fruit);
console.log(f2.name, f2 instanceof Fruit);

现在我得到的输出是:

芒果真的

橙色假

如果我需要输出,我需要做什么: 芒果真的 橙色真实..

我需要一些解释。

我不知道是否有人已经回答了这个问题,但我无法找到它。

3 个答案:

答案 0 :(得分:2)

让我们说我们有Foo构造函数。

function Foo(options) {
   // constructor
   this.name = options.name;
}

// and create instance of it
var foo = new Foo({name: "Foo"});

从MDN参考文献中,“new”运算符执行:

  1. 创建一个新对象,继承自Foo.prototype。
  2. 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。 new Foo等同于新的Foo(),即如果没有指定参数列表,则不带参数调用Foo。
  3. 构造函数返回的对象成为整个新表达式的结果。如果构造函数未显式返回对象,则使用在步骤1中创建的对象。 (通常构造函数不返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做。)
  4. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

    所以基本上它设置对象原型并执行构造函数,返回一个对象,除非构造函数不返回任何其他内容。

    “apply”函数instend,仅在特定上下文中运行函数。它没有设置继承。在你的情况下,它只是在你的自定义obj的上下文中运行构造函数。

    var obj = {};
    

    你可以在这个小提琴上看到这个:

    http://jsfiddle.net/hp244jn7/

    使用了“_ proto _”属性,看看原型链中的什么。不要在开发中使用它。

    如果您想要所需的效果,您应该使用 giorgio 建议的内容。

答案 1 :(得分:1)

您应该使用prototype property来定义您的对象基于其他对象

function myNew(con,args){
 var obj = {};
 obj = con.apply(obj,args) || obj;
 obj.prototype = con;
 return obj;
}

答案 2 :(得分:1)

你的想法很难;)这就是你想要的:

function myNew(con, args) {
    return new con(args);
}

请参阅demo here