`
gtssgtss
  • 浏览: 17327 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

为什么继承的时候动态原型无效

阅读更多
function Polygon(iSides) { 
this.sides = iSides; 
if(typeof Polygon._initialized == "undefined") { 
Polygon.prototype.getArea = function() { 
return 0; 
}; 
Polygon._initialized = true; 
} 
} 
function Triangle(iBase,iHeight) { 
Polygon.call(this,3); 
this.base = iBase; 
this.hei = iHeight; 
if(typeof Triangle._initialized == "undefined") { 
[color=red]Triangle.prototype = new Polygon(); [/color]
Triangle.prototype.getArea = function() { 
return this.base * this.hei * 0.5; 
}; 
Triangle._initialized = true; 
} 
} 
[color=red]var oTriangle1 = new Triangle(12,4);[/color] 


Nicholas解释说在代码运行前,对象已被实例,并与prototype联系,在当前对prototype对象替换不会对它产生任何影响,即当前的替换是访问不到的,只有未来对象的实例才会反映出这种改变。于是第一个实例对象就会不正确。但第二个及以后的子类实例都没问题。

也许是翻译的原因,我觉得解释过于简短,容易让人迷惑。我就思考了一下,现在我谈谈我的理解,不一定正确,欢迎拍砖、

我们知道,js里,函数是第一型,也就是说一个函数就是一个对象。

因此,function Triangle(iBase,iHeight)这个申明,其实就产生了一个对象,只是这个对象虽然叫Triangle,但是因为他的函数体还没有被执行过,所以他的prototype其实是Object。

当执行var oTriangle1 = new Triangle(12,4);时,我们又有了一个oTriangle1对象,但是因为构建对象的时候,函数体还是没有执行,所以oTriangle1的prototype仍然是Object。

接着,我们开始执行函数体,函数体里Triangle的prototype被赋值为new Polygon();所以Triangle的prototype成功修改,但是因为oTriangle1的prototype是Object,而不是Triangle,这个修改就变得与他毫无关系,所以oTriangle1没有被“正确”初始化。
分享到:
评论

相关推荐

    js原型通用验证框架

    原型是JavaScript中的一大特色,通过原型链机制,一个对象可以继承另一个对象的属性和方法,实现类的继承。 框架中可能包含以下关键知识点: 1. **原型链**:JavaScript的对象可以通过原型链共享属性和方法,一个...

    Javascript 学习笔记之 对象篇(二) : 原型对象

    JavaScript中的原型对象(prototype)是实现继承的一种机制,与传统的类继承不同,它采用原型链的概念,使得对象能够共享属性和方法。JavaScript是唯一广泛使用原型继承的主要编程语言,因此理解这种模式至关重要。 ...

    JavaScript面向对象继承原理与实现方法分析

    这能够解释为什么在原型链上越后定义的方法,其调用优先级越高。 另外,JavaScript中的继承机制还允许子类型继承多个类型的属性和方法,这是通过创建多个原型链并将其链接到一起实现的。例如,可以将一个类型的原型...

    简单的游戏技能系统原型,使用java描述.zip

    游戏中的每个元素(如角色、技能)都可以抽象为类,通过继承、封装和多态来实现代码复用和模块化。项目中可能包含`Skill`类、`Character`类等,它们之间可能存在继承关系,比如`SpecialSkill`可能继承自`Skill`。 3...

    JavaScript中继承的一些示例方法与属性参考

    每一个函数在创建的时候,JavaScript会自动为该函数添加一个prototype属性,其值是一个包含constructor属性且指向该函数的原型对象。当使用new操作符创建对象时,新对象的原型会设置为函数的prototype属性值。 ...

    Java-Cafe:Java Cafe原型

    5. **异常处理**:在Java Cafe原型中,可能会遇到各种异常情况,如无效的订单输入或数据库连接问题。通过使用try-catch语句,可以优雅地处理这些异常,防止程序崩溃,并向用户显示友好的错误信息。 6. **文件I/O...

    招聘网站特效制作(源代码参考)

    3. **基于原型**:JavaScript中的对象继承是基于原型的,对象可以直接从其他对象复制属性和方法。 4. **函数即一等公民**:JavaScript将函数视为第一等公民,这意味着函数可以作为值赋给变量、作为参数传递给其他...

    什么是javascript.docx

    JavaScript中的所有对象都可以追溯到一个基础原型,允许开发者通过原型链进行属性和方法的继承。 JavaScript的核心是ECMAScript,这是一个由Ecma国际制定的标准,它的最新版本被称为ECMAScript 2022。除了...

    js-cripple:一个小库,它会干扰您的对象原型,以便删除您可能依赖的功能,但在大多数浏览器中不可用

    当使用`js-cripple`时,库会干扰这些原型方法,可能会将它们替换为无效的或者模拟缺失的功能,这样,如果代码依赖于这些被干扰的方法,就会出现错误或预期之外的行为。 使用"js-cripple"库的过程通常包括引入库文件...

    55个超漂亮超酷实用JS演示代码打包下载

    原型链是JS实现继承的主要方式,每个对象都有一个[[Prototype]]内部属性,形成了原型链。Promise用于解决异步编程中的回调地狱问题,而async/await则进一步简化了异步操作的编写,使得代码更接近同步风格。 在学习...

    在vue中使用回调函数,this调用无效的解决

    在提供的代码示例中,为了解决这个问题,可以看到开发者使用了一个名为`self`的变量来保存`this`的引用: ```javascript let self = this; ``` 这样,在异步回调中,可以使用`self`来引用Vue实例,确保能够正确地...

    ajax,js,css很实用,very good

    此外,CSS还支持层叠、继承和媒体查询等特性,使得开发者能够实现响应式设计,让网站在不同设备上展示良好。 **Ajax、JavaScript与CSS的结合** 当这三者结合时,可以创建出高度交互和动态的网页应用。例如,使用...

    自动取款机设计

    - **安全性**:在C++中,为了确保用户输入的安全,我们可以使用异常处理机制来捕获可能的错误,如无效的卡号或密码。同时,对于敏感信息如密码,应进行加密存储。 - **事务处理**:ATM操作应当是原子性的,即一次...

    javascript常用技巧

    5. **原型与继承**:JavaScript使用原型链实现继承,每个对象都有一个`__proto__`属性指向创建它的构造函数的原型。ES6引入了`class`语法,但其本质仍然是基于原型的继承。 6. **闭包**:闭包是指有权访问另一个...

    javaScript面试精选

    - JavaScript中继承主要通过原型链(`prototype`)来实现。通过设置一个对象的`__proto__`属性指向另一个对象,就可以实现继承。 **8. JavaScript怎样选中一个checkbox,怎样设置它无效?** - 选中一个checkbox: `...

    javaScript经典实例

    8. **对象与原型链**:JavaScript采用原型继承,每个对象都有一个原型(__proto__),可以通过`prototype`属性定义对象的方法,实现类的模拟。 9. **异步编程**:Promise、async/await等机制解决了JavaScript中的回...

    客户端网页编程学习总结.doc.docx

    JavaScript的原型链机制实现了继承,使得一个对象可以继承另一个对象的属性和方法。多态则体现在函数的参数可以接受不同类型的数据,以及对象的方法可以根据不同的上下文表现出不同的行为。 JavaScript是一门弱类型...

    某公司的javascript培训课件

    尽管JavaScript对象通常是预定义的,无法直接创建新的子类,但可以通过原型链实现对象的继承。 4. **事件驱动**:JavaScript的执行往往由用户在浏览器上的操作(如鼠标点击、键盘输入)触发,即通过事件来驱动代码...

    javascript经典实例大全

    7. **面向对象编程**:JavaScript支持基于原型的面向对象编程,实例可能包含构造函数、原型链、继承和封装等概念的示例。 8. **函数式编程**:JavaScript也支持函数式编程风格,如高阶函数、闭包、柯里化等。你可能...

    javascript常用特效及教程

    13. 构造函数与原型链:理解JavaScript的类继承机制,通过构造函数创建实例,利用prototype实现方法共享。 14. 类与模块模式:ES6引入的class关键字简化了面向对象编程,而模块系统(import/export)有助于代码组织...

Global site tag (gtag.js) - Google Analytics