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

Instance does not have access to prototype functions if parent function returns an object

本文关键字:函数 访问 实例 原型 返回 对象 如果      更新时间:2023-09-26

当我注意到如果你从函数返回对象时,我正在测试一些东西,它的实例将没有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 原型不起作用是一个类似的帖子,但我正在寻找它无法访问的原因。

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

var b = new bar();

话虽如此,由于构造函数的原型包含一个名为 notify 的函数,因此可以从像上面一样创建的每个对象访问该函数。(作为侧节点,请记住,构造函数的第一个字母是一种约定,构造函数仅用于使用 new 运算符创建新对象的函数,即大写字母。这样,构造函数就与其余函数区分开来。

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

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

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

正如 MDN 中所描述的:

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

  1. 创建一个新对象,继承自 Foo.prototype。
  2. 构造函数 Foo 使用指定的参数调用,并将其绑定到新创建的对象。 等价于new Foo(),即如果没有指定参数列表,Foo是 没有参数调用。
  3. 构造函数返回的对象将成为整个新表达式的结果。如果构造函数没有 显式返回一个对象,使用步骤 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);