gpt4 book ai didi

Javascript 原型(prototype)继承?

转载 作者:可可西里 更新时间:2023-11-01 01:23:06 25 4
gpt4 key购买 nike

我为了更好地理解它,一直在js中做一些继承,我发现了一些让我感到困惑的东西。

我知道当您使用 new 关键字调用“构造函数”时,您会得到一个引用该函数原型(prototype)的新对象。

我还知道,为了实现原型(prototype)继承,您必须将构造函数的原型(prototype)替换为您希望成为“父类(super class)”的对象的实例。

所以我做了这个愚蠢的例子来尝试这些概念:

function Animal(){}
function Dog(){}

Animal.prototype.run = function(){alert("running...")};

Dog.prototype = new Animal();
Dog.prototype.bark = function(){alert("arf!")};

var fido = new Dog();
fido.bark() //ok
fido.run() //ok

console.log(Dog.prototype) // its an 'Object'
console.log(fido.prototype) // UNDEFINED
console.log(fido.constructor.prototype == Dog.prototype) //this is true

function KillerDog(){};
KillerDog.prototype.deathBite = function(){alert("AAARFFF! *bite*")}

fido.prototype = new KillerDog();

console.log(fido.prototype) // no longer UNDEFINED
fido.deathBite(); // but this doesn't work!

(这是在 Firebug 的控制台中完成的)

1) 为什么如果所有新对象都包含对创建者函数原型(prototype)的引用,那么 fido.prototype 是未定义的?

2) 继承链是 [obj] -> [constructor] -> [prototype] 而不是 [obj] -> [prototype] ?

3) 是否检查过我们对象 (fido) 的“原型(prototype)”属性?如果是这样...为什么“deathBite”未定义(在最后一部分)?

最佳答案

1) Why if all new objects contain a reference to the creator function's prototype, fido.prototype is undefined?

所有新对象都持有对原型(prototype)的引用,该原型(prototype)在构造时存在于它们的构造函数中。但是,用于存储此引用的属性名称不是 prototype,因为它在构造函数本身上。一些 Javascript 实现确实允许通过某些属性名称访问此“隐藏”属性,例如 __proto__ 而其他实现则不允许(例如 Microsofts)。

2) Is the inheritance chain [obj] -> [constructor] -> [prototype] instead of [obj] -> [prototype] ?

没有。看看这个:-

function Base() {}
Base.prototype.doThis = function() { alert("First"); }

function Base2() {}
Base2.prototype.doThis = function() { alert("Second"); }

function Derived() {}
Derived.prototype = new Base()

var x = new Derived()

Derived.prototype = new Base2()

x.doThis();

这提醒“第一”而不是第二。如果继承链通过构造函数,我们会看到“第二”。构造对象时,Functions 原型(prototype)属性中保存的当前引用将转移到对象隐藏的原型(prototype)引用中。

3) is the 'prototype' property of our object (fido) ever checked? if so... why is 'deathBite' undefined (in the last part)?

为对象(函数除外)分配名为 prototype 的属性没有特殊含义,如前所述,对象不会通过此类属性名称维护对其原型(prototype)的引用。

关于Javascript 原型(prototype)继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/391550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com