代码之家  ›  专栏  ›  技术社区  ›  Kaze no Koe

Javascript:建立一系列原型

  •  2
  • Kaze no Koe  · 技术社区  · 16 年前

    var Person = function (name) {
        this.name = name;
    }
    
    Person.prototype = {
        walk: function () {
            alert(this.name  + ' is walking');
        }
    }
    
    var walter = new Person('Walter');
    

    我会走路:

    walter.walk() // => "Walter is walking"
    

    我想知道人们是否会飞?程序员是上帝,我只想让人们能飞:

    var WingedAnimal = function () {
        this.hasWings = true;
    }
    
    WingedAnimal.prototype = {
        fly: function () {
            alert(this.name + ' is flying')
        }
    }
    
    var Person = function (name) {
        this.name = name;
    }
    
    Person.prototype =  {
        walk: function () {
            alert(this.name  + ' is walking');
        },
        prototype: new WingedAnimal()
    }
    
    var walter = new Person('Walter');
    
    walter.walk() // => 'Walter is walking'
    
    walter.fly();
    

    TypeError:walter.fly()不是函数

    好的,那么:

    Person.prototype =  {
        walk: function () {
            alert(this.name  + ' is walking');
        }
    }
    
    Person.prototype.prototype = new WingedAnimal();
    
    var walter = new Person('Walter');
    
    walter.walk() // => 'Walter is walking'
    
    walter.fly();
    

    TypeError:walter.fly()不是函数

    真的没有办法吗?我的意思是,拥有一系列原型,而不是将多个对象混合到一个原型中?


    为了澄清我的问题:

    目前,我已经用一个我通常调用的函数解决了这个问题 混合 并放入一个通常称为 . 该函数复制它传递到第一个对象中的所有对象的成员。我的代码通常如下所示:

    var Constructor = function () {
        // stuff
    }
    
    CORE.mix(Constructor.prototype, SomeInterface, AnotherInterface, {
        //stuff that goes only into objects made with Constructor
    });
    

    SomeInterface、AnotherInterface和object literal中的所有内容都会进入Constructor.prototype,优先级从右到左。然而,我认为Javascript不应该这样工作。我想,我应该有一系列的原型,而不仅仅是一个混入了很多东西的原型。

    方法 this great explanation . 我错了吗?是 每个对象的原型真的是我们所能使用的吗?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Tim Down    16 年前

    prototype 属性仅在指定给构造函数时才有用。

    Person.prototype = new WingedAnimal();
    
    Person.prototype.walk = function () {
        alert(this.name  + ' is walking');
    };
    
    var walter = new Person('Walter');
    
    walter.walk() // => 'Walter is walking'
    
    walter.fly();
    
        2
  •  2
  •   Community Mohan Dere    9 年前
    Person.prototype= {
        walk: function () {
                alert(this.name  + ' is walking');
        },
        prototype: new WingedAnimal()
    }
    

    这不管用:这个 prototype 属性位于构造函数上,而不是原型对象上:

    Person.prototype= new WingedAnimal();
    Person.prototype.walk= function() {
        alert(this.name  + ' is walking');
    };
    

    然而,这也是有缺陷的,因为它试图将一个类基于一个实例;这适用于WingedAnimal,因为它的构造函数没有做什么,但它是一个糟糕的模式(由许多糟糕的JS教程发布),会混淆任何更复杂的任务。

    this question

    推荐文章