0 0

关于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个答案 按时间排序 按投票排序

0 0

采纳的答案

未调用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
0 0

直接修改prototype,不会影响他的实例,修改constructor的prototype的field才会改变实例

2008年8月26日 16:42
0 0

LZ你把Triangle.prototype = new Polygon()这行代码写在构造函数里面
从逻辑上讲,这个位置是正确的,
但从技术上说,在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了,虽然用极晚绑定可使对原型对象的修改正确的反映出来,但替换prototype对象却不会对该对象产生任何的影响,只有对未来的对象实例才会反映出这种改变,这个是你第一个实例没有打印出来,而第二个实例打印出来的原因。
因此按你这种方式继承的话,必须在构造函数外赋予新的prototype对象。

LZ可以看看 《javascript高级程序设计》第4章,里面对js的继承做了详细的介绍。
希望能对lz有所帮助

2008年8月26日 15:16

相关推荐

    javascript原型继承代码案例

    javascript原型继承,prototype的使用,可以像java一样继承

    理解Javascript原型继承原理

    ### 理解Javascript原型继承原理 #### 一、引言 在JavaScript中,原型继承是一种非常核心且独特的机制,它使得对象能够继承其他对象的属性和方法。本文旨在深入探讨这一机制,并通过具体的示例代码帮助读者更好地...

    js的原型继承

    由于JavaScript没有类的概念,所以通常会结合构造函数和原型继承,形成所谓的“组合继承”。这种方式既保留了构造函数初始化实例的灵活性,又利用了原型链实现方法的共享。 ```javascript function SuperClass(name...

    再谈javascript原型继承

    Javascript原型继承是一个被说烂掉了的话题,但是自己对于这个问题一直没有彻底理解,今天花了点时间又看了一遍《Javascript模式》中关于原型实现继承的几种方法,下面来一一说明下,在最后我根据自己的理解提出了一...

    浅析Javascript原型继承 推荐第1/2页

    在深入探讨JavaScript的原型继承之前,首先要明确的是JavaScript中并没有类似其他编程语言中的类继承的概念。虽然有传言JavaScript 2.0将加入类继承机制,但考虑到要让所有浏览器支持新特性可能需要很长时间,因此...

    深入探索JavaScript的原型继承:机制、实现与最佳实践

    本文将深入探讨JavaScript原型继承的工作原理、实现方式以及在现代Web开发中的应用。 JavaScript的原型继承是一种强大且灵活的机制,它允许对象之间共享功能和行为。通过深入理解原型继承的工作原理和实现方式,...

    浅析javascript原型继承机制

    ### 浅析JavaScript原型继承机制 #### 一、引言 JavaScript作为一种动态语言,其对象模型与传统的面向对象编程语言有所不同。在JavaScript中,并没有直接提供类的概念,而是通过原型来实现继承。本文将深入探讨...

    javascript原型继承工作原理和实例详解_.docx

    ### JavaScript原型继承工作原理及实例详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发中扮演着重要角色。其独特的面向对象机制是通过原型继承来实现的,这种机制使得JavaScript能够灵活地...

    探索JavaScript的原型链:原型继承的奥秘

    ### 探索JavaScript的原型链:原型继承的奥秘 #### 一、JavaScript与原型继承的基础 JavaScript(简称JS)是一种广泛使用的高级编程语言,在Web开发中占据着核心地位。它的特性之一是基于原型的继承机制,这与其他...

    javascript原型继承机制参考.pdf

    javascript原型继承机制参考.pdf

    javascript原型继承机制借鉴.pdf

    javascript原型继承机制借鉴.pdf

    javascript原型继承机制归类.pdf

    javascript原型继承机制归类.pdf

    Javascript原型继承

    JavaScript原型继承是面向对象编程在JavaScript中的实现方式之一,它基于原型(Prototype)和对象的特性,使得一个对象可以继承另一个对象的属性和方法。在JavaScript中,每个对象都有一个特殊的内部属性`[...

    原型继承面试题精讲完整版

    在 JavaScript 中,我们可以使用原型继承来实现对象的继承。 在给定的代码中,我们可以看到一个简单的示例,演示了如何使用原型继承创建一个新的对象“精力旺盛的狗狗”,并继承“小狗狗”的基本特点。 首先,我们...

    JS原型继承四步曲及原型继承图一览

    "JS原型继承四步曲"是指通过以下四个步骤实现类的继承: 1. **创建父类**: 在这个例子中,我们创建了一个名为`Animal`的函数,作为父类。这个父类有一个`name`属性,并有一个`eat`方法,用于表示动物吃东西的行为...

    javascript原型继承机制[整理].pdf

    javascript原型继承机制[整理].pdf

    JavaScript 原型继承之构造函数继承

    JavaScript中的构造函数继承是基于原型继承的一种实现方式,它允许一个构造函数(子类)从另一个构造函数(父类)那里继承属性和方法。在JavaScript中,每个对象都有一个[[Prototype]]内部属性,通常通过`__proto__`...

    js原型继承的两种方法对比介绍.docx

    ### JS原型继承的两种方法对比介绍 #### 一、引言 在JavaScript中,对象间的继承机制主要依赖于原型链。原型链的概念使得JavaScript能够实现动态面向对象编程,并且提供了非常灵活的对象创建与继承的方式。在实际...

Global site tag (gtag.js) - Google Analytics