Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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 - Fatal编程技术网

Javascript 将继承隔离到函数中

Javascript 将继承隔离到函数中,javascript,Javascript,我试图将继承部分隔离到一个函数中,但当我创建对象时,会发出nothings警报,不会返回任何错误,因此我很难找到如何调试和解决方案 function Shape(){} // augment prototype Shape.prototype.name = 'shape'; Shape.prototype.toString = function() {return this.name;}; function TwoDShape(){} // augment prototype TwoDSh

我试图将继承部分隔离到一个函数中,但当我创建对象时,会发出nothings警报,不会返回任何错误,因此我很难找到如何调试和解决方案

function Shape(){}
// augment prototype
Shape.prototype.name = 'shape';
Shape.prototype.toString = function() {return this.name;};

function TwoDShape(){}


// augment prototype
TwoDShape.prototype.name = '2D shape';



function Triangle(side, height) {
this.side = side;
this.height = height;
}


// augment prototype
Triangle.prototype.name = 'Triangle';
Triangle.prototype.getArea = function(){return this.side * this.height / 2;};




var myTriangle = new Triangle(5, 10);

function extend(Child, Parent) {
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype;
}


extend(TwoDShape, Shape);
extend(Triangle, TwoDShape);


var myTriangle = new Triangle(5, 10);


alert(myTriangle.getArea());

alert(myTriangle.toString());

var s = new Shape();
alert(s.name);

TIA

您的代码似乎有点复杂。请参阅更简单的示例(请记住打开调试工具以查看日志消息)

值得注意的是,JavaScript中的继承是通过遵循原型链来实现的。这意味着每个对象都有一个对原型对象的引用。这个原型对象也是任何普通对象。关键在于,只要在对象中找不到属性(或函数),就会检查其原型对象。这将遵循原型链接,直到找到值或没有剩余原型

每当创建对象时,prototype链接就会存储在对象中,并指向对象构造函数的
prototype
属性中指定的对象。您可以通过检查对象的属性来检查Firefox中的原型

在链接示例中,有3个构造函数:

  • 形状
  • 三角
  • createPrototype(使用已定义的prototype链接获取空对象的助手)
在链接示例中,有两个原型对象:

  • Shape.prototype(包含形状的共享属性)
  • Triangle.prototype(包含三角形的共享属性)
首先,通过调用
newshape()
创建一个形状。这将创建一个新对象,因为
new
写在名为
Shape
的函数前面。对象的prototype链接(Firefox中的
\uuuu proto\uuu
)指向
Shape.prototype
,因为构造函数的这个属性给出了prototype链接的目标。链接是在对象实例化时设置的

因此,每当您尝试访问
形状的属性时,都会按如下方式检索该属性。首先,搜索属性的
shape
。如果它在那里,就用它。如果不是,则检索原型对象
shape.\uuuu proto\uuu
,它引用与
shape.prototype
相同的对象。现在,在prototype对象中搜索属性

对于三角形的情况,事情有点复杂,因为涉及多个原型链接。重要的是,我们需要创建一个空对象来保存三角形的共享属性,还需要将其prototype链接设置为指向
Shape.prototype
。这使得形状的原型成为三角形原型的后援。
它由包含
createPrototype
的匿名函数存档。需要包括它,因为匿名函数的每次调用都需要操作构造函数函数的
prototype
属性(在本例中称为
createPrototype
)。创建带有原型链的空原型对象后,它会立即返回并分配给
Triangle.prototype
。之后,由
new Triangle()
创建的任何对象都具有所需的原型链

设置好后,我们可以将三角形的所有共享属性添加到刚刚创建的
Triangle.prototype
对象中。这通过覆盖
paint
和添加
getArea
来显示。注意:这种覆盖实际上是有效的,因为三角形的
绘制
函数早于形状的
绘制
方法,并且使用了第一个找到的引用/属性

总之,对象上的所有属性访问都使用原型链进行回退。在我们的例子中,
shape
的链是
shape
→<代码>形状。原型
三角形
的原型是
三角形
→<代码>三角形。原型→<代码>形状.原型

您可能希望为匿名函数(包括
createPrototype
)指定一个名称,以便为创建的对象层次结构提供一个工具。这将显示在中,并以以下辅助对象结束:


请在此处粘贴代码,以便在链接过期时不会丢失问题的上下文。
function makePrototype(parent){
    // We need a new object whose prototype link points to parent.prototype
    function createPrototype(){
    }
    createPrototype.prototype = parent.prototype;
    return new createPrototype();
}