Javascript 原型遗传——正确的方法

Javascript 原型遗传——正确的方法,javascript,Javascript,根据Douglas Crockford的说法,我一直在研究如何以正确的原型方式在JavaScript中进行继承: 他写道:“因此,不创建类,而是创建原型对象,然后使用对象函数创建新实例” 我想这就是解决问题的方法: var objA = { func_a : function() { alert('A'); } }; var objB = Object.create(objA); objB.func_a = function() { alert('B');

根据Douglas Crockford的说法,我一直在研究如何以正确的原型方式在JavaScript中进行继承:

他写道:“因此,不创建类,而是创建原型对象,然后使用对象函数创建新实例”

我想这就是解决问题的方法:

var objA = {
    func_a : function() {
        alert('A');
    }
};

var objB = Object.create(objA);
objB.func_a = function() {
   alert('B');
}
objB.func_b = function() {
};


var objA_instance1 = Object.create(objA);
var objA_instance2 = Object.create(objA);
var objB_instance1 = Object.create(objB);
var objB_instance2 = Object.create(objB);
etc...
但这是否意味着现在有四个func_a实例(因为它不是objA.prototype的一部分,它只是“在”它里面),或者我没有正确理解这一点

另外,是否有任何方法可以访问函数的重写函数(例如在objB.func_a中调用objA.func_a)


提前感谢。

只有一个
func_a
实例,它在
objA
上定义,这是因为Crockford的
对象。create
方法使用该对象(
objA
)作为新对象的原型:

console.log(objA_instance1.func_a == objA .func_a); // true
console.log(objA_instance2.func_a == objA .func_a); // true
func_a
在您的objA_实例上,原型链可以到达,对象实际上并不拥有该属性:

console.log(objA_instance1.hasOwnProperty('func_a')); // false
console.log(objA_instance2.hasOwnProperty('func_a')); // false

你把构造函数函数的
prototype
属性和对象的内部[[prototype]]属性搞混了,这是不可访问的(FF使其可用作
\uuuuuuuuuuuuuuuuuuuu
);使用
Object.create()
将此内部属性设置为其参数,因此
objA
objB
将成为“实例”对象的实际原型,即不会复制任何函数对象

要调用重写的函数,请通过eg
objA.func_a
访问它们,并在特定实例上使用或使用它们,例如

objB.func_a = function() {
    objA.func_a.call(this); // call overridden method with current `this`
};

[[Prototype]]可以通过
Object.getPrototypeOf(Object)
访问,尽管它只是ES5。