Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:建立一系列原型_Javascript_Prototype - Fatal编程技术网

Javascript:建立一系列原型

Javascript:建立一系列原型,javascript,prototype,Javascript,Prototype,在Javascript中,每个对象都有一个原型。任何原型都是对象,因此任何原型都有原型 这是我: var Person = function (name) { this.name = name; } Person.prototype = { walk: function () { alert(this.name + ' is walking'); } } var walter = new Person('Walter'); 我会走路: walter

在Javascript中,每个对象都有一个原型。任何原型都是对象,因此任何原型都有原型

这是我:

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不是一个函数

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

不是我不喜欢把东西混在一起,而是

为了澄清我的问题:

目前,我已经用一个通常称为mix的函数解决了这个问题,并将它放在一个通常称为CORE的名称空间中。该函数复制它传递到第一个对象中的所有对象的成员。我的代码通常如下所示:

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不应该这样工作。我想,我应该有一系列的原型,而不仅仅是一个混入了很多东西的原型


当我调用someObject.method时,应该在someObject中搜索方法;如果不存在,则应搜索到某个Object.prototype;然后在someObject.prototype.prototype中;以此类推,直到一个原型有一个未定义的原型,那么它应该失败。这就是我对它的理解。我错了吗?每个对象只有一个原型吗?我想你误解了原型属性。虽然所有对象都有对其原型的内部引用,但无法在每个浏览器中直接获取或设置该引用。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();
这不起作用:prototype属性位于构造函数上,而不是位于prototype对象上:

Person.prototype= new WingedAnimal();
Person.prototype.walk= function() {
    alert(this.name  + ' is walking');
};
然而,这也是有缺陷的,因为它试图将一个类基于一个实例;这适用于WingedAnimal,因为它的构造函数没有做什么,但它是由许多糟糕的JS教程发布的一个糟糕模式,会混淆任何更复杂的任务


请参阅以获取JavaScript中原型的概述。

这澄清了一些问题,谢谢。你会说把所有东西混合到同一个原型中是更好的方法吗?好吧,随便吧。你确实回答了,我会为WingedAnimal和Person整理出我自己的原型?我希望这只是一个案例,任何真实的案例都必须根据自身的是非曲直来判断。就我个人而言,我更喜欢相对较浅的原型树,而不是Java风格的深层继承,但我不知道我会让一个人成为一个有翼动物!
Person.prototype= new WingedAnimal();
Person.prototype.walk= function() {
    alert(this.name  + ' is walking');
};