当我注意到如果你从一个函数返回对象时,我正在测试一些东西,它的实例将没有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是类似的帖子,但我正在寻找无法访问的原因。
答案 0 :(得分:1)
在第一种情况下,您使用构造函数模式。因此this
绑定到您创建的新对象
var b = new bar();
话虽如此,由于构造函数的原型包含一个名为notify
的函数,因此可以从上面创建的每个对象访问此函数。 (作为一个副节点,请记住,它是一个常规构造函数的第一个字母,一个仅用于使用new运算符创建新对象的函数,是一个大写。这样一种构造函数区别于其余的功能。)
另一方面,在以下情况中:
function bar1(){
var test = "test";
return {test: test};
}
return
语句会覆盖默认行为,并返回一个新对象。
如MDN:
中所述当执行代码new Foo(...)时,会发生以下情况:
- 创建一个新对象,继承自Foo.prototype。
- 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。新的Foo是 相当于新的Foo(),即如果没有指定参数列表,则Foo为 无争议地召集。
- 构造函数返回的对象成为整个新表达式的结果。如果构造函数不起作用 显式返回一个对象,使用在步骤1中创建的对象 代替。 (通常情况下,施工人员不会返回值,但他们可以 如果他们想要覆盖正常的对象创建,请选择这样做 过程即可。)
醇>
// 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;