javascript – 原型继承的一个例子,它不涉及模拟经典继承?

我已经阅读了以下QAs,并且所有这些QAs都使用原型继承来模拟经典继承.

Good Example of JavaScript’s Prototype-Based Inheritance

javascript inheritance

Using inheritance patterns in JavaScript

在野外没有一个原型继承的工作实例吗?模拟生命形式,也许?除了编程语言创建或未充分解决的问题之外,哪些问题会从原始的原型继承中受益?

最佳答案
继承是继承,因此您可以从中获得相同的基本功能.

JavaScript中原型继承的一个好处是允许动态运行时添加新方法或更改旧方法可用于所有对象(不添加每个对象的内存损失).

这可能很危险,尤其是当内置方法(如String或Object)以颠覆(或前瞻性)方式覆盖其内置方法时.

String.prototype.replace = function () {
    return 'hahaha';
};

但是当某些浏览器或库的实现功能不足或性能滞后时,它可能会很强大.

它还有助于库的模块化,可扩展性和改进.如果您包含某人的库并发现他们的特定方法的实现可以更好地优化,您可以在不篡改它的情况下放入他们的代码,同时仍然能够改进它或为其添加功能并使其外部定义的所有对象受益.库(至少在您开始将其添加到原型中时).库甚至可以根据用户的喜好来交换实现(虽然它可能会干扰使用该方法的其他代码,但通常不是一个好主意),或者让它们动态定义他们想要使用的方法的名称.

甚至在“类”中也可以发挥原型行为的作用,因为你可以利用直接存储在对象上的便利性(尽管在这种情况下它确实会增加内存,而且最好只是为了创建一个新类 – 但是它仍然可以很方便).

function Dog (type) {
    if (type === 'poodle') {
        this.bark = function () {
            alert('(yapyapyap)');
        };
    }
}
Dog.prototype.bark = function () {
    alert('(woof)');
};

var muffy = new Dog('poodle');
muffy.bark(); // '(yapyapyap)'
var rover = new Dog();
rover.bark(); // '(woof)'

原型是可以在JavaScript的原型方法中动态更改或交换的事实,这使得您可以在运行时动态创建新类,这与一些更传统的语言不同,至少提供一些更简洁的表达性:

function Creature () {}
Creature.prototype.respire = function () { return 'oooooh'; };

function createClass (o, f) {
    f = f || function f () {}
    f.prototype = (typeof o === 'function') ? o.prototype : o.constructor.prototype;
    f.prototype.constructor = f;
    return f;
}

var animals = ['Dog', 'Tiger', 'Lion', 'Frog', 'Kangaroo'];
animals.forEach(function (animal) {
    window[animal] = createClass(Creature);
});
var rover = new Dog();

最后,您可以通过借用您需要的内容来避免严格的is-a层次结构,同时仍然利用可继承的功能:

function createMixinClass (old, constructor, newMethods) {
    if (typeof constructor === 'object') {
        newMethods = constructor;
        constructor = null;
    }
    var proto = old.prototype, constructor = constructor || function () {};

    for (var m in proto) {
        constructor.prototype[m] = proto[m];
    }
    for (var method in newMethods) {
        if (!newMethods[method]) {
            delete constructor.prototype[method];
        }
        else {
            constructor.prototype[method] = newMethods[method];
        }
    }
    return constructor;
}

var Cat = createMixinClass(Dog, {bark:null, meow: function () {alert('meow');}});
var kitty = new Cat();

简而言之,我认为没有什么可以让你处理新问题,但它提供了更大的灵活性,特别是一些可重复使用的实用程序.

转载注明原文:javascript – 原型继承的一个例子,它不涉及模拟经典继承? - 代码日志