-
关于JS原型继承的问题20
function Polygon() {
Polygon.prototype.getArea = function () {
return 0;
}
}
function Triangle() {
Triangle.prototype = new Polygon();
}
var triangle = new Triangle();
alert(triangle.getArea());
var triangle1 = new Triangle();
alert(triangle1.getArea());
这段代码打不出东西来,如果我把alert(triangle.getArea());去掉, alert(triangle1.getArea());就可以打出来
这是为什么啊 ,也就是要在第2次实例化Triangle时才能打出来"OK".
或者代码改成如下:
function Polygon() {
Polygon.prototype.getArea = function () {
return "OK";
}
}
function Triangle() {
}
Triangle.prototype = new Polygon();
var triangle = new Triangle();
alert(triangle.getArea());
var triangle1 = new Triangle();
alert(triangle1.getArea());
这样就正常了,Triangle.prototype = new Polygon();这行代码写在函数里面和外面有什么区别呢
请问下这是为什么
问题补充:
哈哈 我就是看了这本书 就是对书上的这个解释不明白才用的
但从技术上说,在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了,虽然用极晚绑定可使对原型对象的修改正确的反映出来,但替换prototype对象却不会对该对象产生任何的影响,只有对未来的对象实例才会反映出这种改变
这个我不知道怎么理解2008年8月26日 13:43
3个答案 按时间排序 按投票排序
-
采纳的答案
未调用new Triangle()时,由于Triangle()中的构造函数还没有执行,所以Triganle对象的prototype并未改变。这时使用new Triangle()创建的对象,是原始的Triangle对象。
而调用过一次new Triangle()后,Traingle.prototype=new Polygon()被执行。Triangle的prototype被改变了。所以再次new Triangle()创建的就是改变之后的Triangle对象。
对此,楼主可以参照下面这个例子测试一下。var i=0;//标识是第几次生成的Traingle对象。 function Polygon() { Polygon.prototype.getArea = function (){ return "Polygon getArea()"; } } function OtherPolygon() { OtherPolygon.prototype.getArea = function (){ return "OtherPolygon getArea()"; } } function Triangle() { if(i==0){ Triangle.prototype = new Polygon(); }else if(i==1){ Triangle.prototype = new OtherPolygon(); } i++; } Triangle.prototype.getArea = function(){ return "Triangle getArea()"; } var triangle1 = new Triangle(); //第一次生成时,使用的是原始的prototype,结果为"Traingle getArea()", //并执行了Triangle.prototype = new Polygon();语句。 alert(triangle1.getArea()); var triangle = new Triangle(); //第二次生成时,使用的是修改后的prototype(new Polygon()),结果为"Polygon getArea()", //并执行了Triangle.prototype = new OtherPolygon();语句。 alert(triangle.getArea()); var triangle = new Triangle(); //第三次生成时,使用的是修改后的prototype(new OtherPolygon()),结果为"OtherPolygon getArea()", alert(triangle.getArea());
2008年8月26日 16:59
-
LZ你把Triangle.prototype = new Polygon()这行代码写在构造函数里面
从逻辑上讲,这个位置是正确的,
但从技术上说,在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了,虽然用极晚绑定可使对原型对象的修改正确的反映出来,但替换prototype对象却不会对该对象产生任何的影响,只有对未来的对象实例才会反映出这种改变,这个是你第一个实例没有打印出来,而第二个实例打印出来的原因。
因此按你这种方式继承的话,必须在构造函数外赋予新的prototype对象。
LZ可以看看 《javascript高级程序设计》第4章,里面对js的继承做了详细的介绍。
希望能对lz有所帮助2008年8月26日 15:16
相关推荐
javascript原型继承,prototype的使用,可以像java一样继承
### 理解Javascript原型继承原理 #### 一、引言 在JavaScript中,原型继承是一种非常核心且独特的机制,它使得对象能够继承其他对象的属性和方法。本文旨在深入探讨这一机制,并通过具体的示例代码帮助读者更好地...
由于JavaScript没有类的概念,所以通常会结合构造函数和原型继承,形成所谓的“组合继承”。这种方式既保留了构造函数初始化实例的灵活性,又利用了原型链实现方法的共享。 ```javascript function SuperClass(name...
Javascript原型继承是一个被说烂掉了的话题,但是自己对于这个问题一直没有彻底理解,今天花了点时间又看了一遍《Javascript模式》中关于原型实现继承的几种方法,下面来一一说明下,在最后我根据自己的理解提出了一...
在深入探讨JavaScript的原型继承之前,首先要明确的是JavaScript中并没有类似其他编程语言中的类继承的概念。虽然有传言JavaScript 2.0将加入类继承机制,但考虑到要让所有浏览器支持新特性可能需要很长时间,因此...
本文将深入探讨JavaScript原型继承的工作原理、实现方式以及在现代Web开发中的应用。 JavaScript的原型继承是一种强大且灵活的机制,它允许对象之间共享功能和行为。通过深入理解原型继承的工作原理和实现方式,...
### 浅析JavaScript原型继承机制 #### 一、引言 JavaScript作为一种动态语言,其对象模型与传统的面向对象编程语言有所不同。在JavaScript中,并没有直接提供类的概念,而是通过原型来实现继承。本文将深入探讨...
### JavaScript原型继承工作原理及实例详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发中扮演着重要角色。其独特的面向对象机制是通过原型继承来实现的,这种机制使得JavaScript能够灵活地...
### 探索JavaScript的原型链:原型继承的奥秘 #### 一、JavaScript与原型继承的基础 JavaScript(简称JS)是一种广泛使用的高级编程语言,在Web开发中占据着核心地位。它的特性之一是基于原型的继承机制,这与其他...
javascript原型继承机制参考.pdf
javascript原型继承机制借鉴.pdf
javascript原型继承机制归类.pdf
JavaScript原型继承是面向对象编程在JavaScript中的实现方式之一,它基于原型(Prototype)和对象的特性,使得一个对象可以继承另一个对象的属性和方法。在JavaScript中,每个对象都有一个特殊的内部属性`[...
在 JavaScript 中,我们可以使用原型继承来实现对象的继承。 在给定的代码中,我们可以看到一个简单的示例,演示了如何使用原型继承创建一个新的对象“精力旺盛的狗狗”,并继承“小狗狗”的基本特点。 首先,我们...
"JS原型继承四步曲"是指通过以下四个步骤实现类的继承: 1. **创建父类**: 在这个例子中,我们创建了一个名为`Animal`的函数,作为父类。这个父类有一个`name`属性,并有一个`eat`方法,用于表示动物吃东西的行为...
javascript原型继承机制[整理].pdf
JavaScript中的构造函数继承是基于原型继承的一种实现方式,它允许一个构造函数(子类)从另一个构造函数(父类)那里继承属性和方法。在JavaScript中,每个对象都有一个[[Prototype]]内部属性,通常通过`__proto__`...
### JS原型继承的两种方法对比介绍 #### 一、引言 在JavaScript中,对象间的继承机制主要依赖于原型链。原型链的概念使得JavaScript能够实现动态面向对象编程,并且提供了非常灵活的对象创建与继承的方式。在实际...