Javascript 在函数构造函数中设置原型

Javascript 在函数构造函数中设置原型,javascript,prototype,Javascript,Prototype,如何将sayBar添加到函数构造函数内的b原型中 Doesb.prototype=newa()覆盖原型,或将b与a合并?您没有使用正确的继承模式 使用: 在您执行简单覆盖的情况下,您没有正确地建立继承对象。创建是ES5,但您可以用以下内容填充: 对象。创建 b.prototype = Object.create(a.prototype); 访问原型 b.prototype = Object.create(a.prototype); 无法访问定义块内的原型。您对此有一个参考 if (!Obje

如何将
sayBar
添加到函数构造函数内的
b
原型中


Does
b.prototype=newa()
覆盖原型,或将
b
a
合并?

您没有使用正确的继承模式

使用:

在您执行简单覆盖的情况下,您没有正确地建立继承<代码>对象。创建是ES5,但您可以用以下内容填充:

对象。创建

b.prototype = Object.create(a.prototype);
访问原型

b.prototype = Object.create(a.prototype);
无法访问定义块内的
原型。您对此有一个
参考

if (!Object.create) {
    Object.create = function (o) {
        if (arguments.length > 1) {
            throw new Error('Object.create implementation only accepts the first parameter.');
        }
        function F() {}
        F.prototype = o;
        return new F();
    };
}

Does
b.prototype=newa()覆盖原型,或将b与a合并

它确实会用一个新的
实例覆盖它;未合并任何内容(例如,您需要更新
b.prototype.constructor
属性)。这就是为什么要将所有属性添加到这一行之后的
b.prototype
。但是,实际上您不想创建实例,只需正确设置原型链即可:

var b = function() {
    a.call(this);
    b.prototype.doSomething = function() {console.log("b");}; 
};
b.prototype = Object.create(a.prototype);
如何将sayBar添加到函数构造函数内的b原型中

您不应该将它添加到原型中,因为它不是原型(共享)方法-它的实例特定于每个
a
实例(至少应该是这样,否则您将把它放在
a.prototype
上,然后它会被上面的行覆盖)。要同时在所有
b
实例上获取实例方法,可以使用

b.prototype = Object.create(a.prototype);
内部构造函数的原型排序 您可以使用包装功能。我相信它们在Javascript中被称为decoratorfunctions。你在那里设置原型。然后,当您使用decoratorfunction作为构造函数时,您不必单独设置原型。可以说,它是在一个充当构造函数的函数中设置的

var b = function(){
    a.call(this); // invoke the `a` constructor on this instance
};
那么你只要做:

function Human(name, lastname, age) {
  function _human(name, lastname, age) {
    this.name = name;
    this.lastname = lastname;
    this.age = age;
  }
  _human.prototype.sayName = function() {
    console.log(this.name + " " + this.lastname);
  }
  var temp = new _human(name, lastname, age);
  return temp;
}

这是否合并了原型?浏览器如何支持
Object.create
?谢谢,为了在旧浏览器中支持
Object.create
,包含
Object.create的源代码就足够了吗?还是它依赖于其他功能?@Johan好的,还有最后一个问题,我相信你还没有回答。如何在函数中访问b原型?@alex23在
b
构造函数中。嗯,不确定我是否在最后一部分跟踪你。如果我在b construcor函数中使用
this.sayBar=…
,那么必须为b的每个实例重新定义它,对吗?将它添加到原型中不是更好吗?@alex23不,函数并不总是在原型中。@alex23那么请解释为什么我在控制台中看不到两个方法:@alex23不,一个添加了
this.func=function(){…}
的函数是该对象的直接属性,并且根本不涉及原型。@Johan:正确。您的
sayFoo
sayBar
函数当前已为每个实例重新定义。因为它们不需要访问任何闭包变量,所以最好在原型上。不要听alex23的话。原型的整个想法是在构造函数之外而不是在构造函数内部定义它。阅读以下内容:我完全理解在构造函数内部设置属性的愿望,因为在构造函数外部设置它看起来是如此的不连续。进一步添加了我自己的基于包装器的解决方案。
var person = new Human("John", "Doe", 25);
console.log(person);
person.sayName();