如果父函数返回对象,则实例无权访问原型函数

时间:2016-07-09 08:05:09

标签: javascript prototype

当我注意到如果你从一个函数返回对象时,我正在测试一些东西,它的实例将没有custom prototype functions



// This works
function bar(){
  var test = "test";
  return test; 
}

bar.prototype.notify = function(){console.log("Hello Bar");}
var b = new bar();
b.notify()

function bar1(){
  var test = "test";
  return {test: test}; 
}
bar1.prototype.notify = function(){console.log("Hello Bar");}
var b1 = new bar1();
b1.notify()




注意: Javascript Prototype not Working是类似的帖子,但我正在寻找无法访问的原因。

1 个答案:

答案 0 :(得分:1)

在第一种情况下,您使用构造函数模式。因此this绑定到您创建的新对象

var b = new bar();

话虽如此,由于构造函数的原型包含一个名为notify的函数,因此可以从上面创建的每个对象访问此函数。 (作为一个副节点,请记住,它是一个常规构造函数的第一个字母,一个仅用于使用new运算符创建新对象的函数,是一个大写。这样一种构造函数区别于其余的功能。)

另一方面,在以下情况中:

function bar1(){
    var test = "test";
    return {test: test}; 
}

return语句会覆盖默认行为,并返回一个新对象。

MDN

中所述
  

当执行代码new Foo(...)时,会发生以下情况:

     
      
  1. 创建一个新对象,继承自Foo.prototype。
  2.   
  3. 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。新的Foo是   相当于新的Foo(),即如果没有指定参数列表,则Foo为   无争议地召集。
  4.   
  5. 构造函数返回的对象成为整个新表达式的结果。如果构造函数不起作用   显式返回一个对象,使用在步骤1中创建的对象   代替。 (通常情况下,施工人员不会返回值,但他们可以   如果他们想要覆盖正常的对象创建,请选择这样做   过程即可。)
  6.   



// This works
function bar(){
  var test = "test";
  return test; 
}

bar.prototype.notify = function(){console.log("Hello Bar");}
var b = new bar();
document.write('b constructor is:'+ b.constructor);
document.write('</br>')

function bar1(){
  var test = "test";
  return {test: test}; 
}

var b1 = new bar1();
document.write('b1 constructor is:'+ b1.constructor);
&#13;
&#13;
&#13;