`

javascript读取和修改原型特别需要注意原型的读写不具有对等性

阅读更多

        对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象A,假设它的原型对象是B,B的原型对象是null。如果我们需要读取A对象的name属性值,那么JS会优先在A中查找,如果找到了name属性那么就返回;如果A中没有name属性,那么就到原型B中查找name,如果找到了就返回;如果原型B中也没有找到,由于此时已经到了原型链的最顶端,还是没有找到name,就直接返回undefined。在写的情况下,执行A.name="aty",如果A中有name属性,那么会修改name属性的值;如果A没有name属性,那么会在A中新增一个name属性,不会有查找原型的过程。

        为什么写的时候不理会原型呢?也可以理解,因为原型是所有对象共享的,通过这种类似的copy-on-write机制,能够保证对象之间不会相互影响。这种机制有好有坏,在使用的时候需要注意。

function Person() 
{  
}

//为Person类的原型添加数据
Person.prototype.plainProp="hi";
Person.prototype.objectProp={"age":10};

var a = new Person();
var b = new Person();

a.plainProp="hello";//重新赋值,没有改变原型

//没有对引用重新赋值,只是通过引用修改对象的属性
a.objectProp.age=20;

alert(a.plainProp);//hello
alert(b.plainProp);//hi
alert(a.objectProp.age);//20
alert(b.objectProp.age);//20

        上面代码可以发现,对于原型的写确实有copy-on-write特性。如果我们想知道,属性或方法到底是来自对象自身,还是来自原型,那么可以使用Object.hasOwnProperty()函数。JS中几乎所有的函数都不区分数据到底是来自对象自身,还是其原型链,只有这一个函数区分。

//测试属性是在自身对象,还是在原型中
alert(a.hasOwnProperty("plainProp"))//true
alert(a.hasOwnProperty("objectProp"));//false

 

文章来源:http://blog.csdn.net/aitangyong/article/details/39674937

分享到:
评论

相关推荐

    Javascript 读取Excel实例

    然而,在某些特定情况下,如在客户端处理用户上传的Excel文件,我们可能需要实现JavaScript读取Excel文件的功能。下面将详细介绍如何在JavaScript中实现这一功能,以及相关知识点。 1. **使用FileReader API** ...

    Javascript写入和读取txt文件

    ### JavaScript写入与读取TXT文件详解 #### 一、前言 在Web开发中,JavaScript主要用于客户端操作,而直接操作文件系统(如读写文件)通常被视为服务器端的任务。然而,在某些特定环境下,比如使用IE浏览器时,...

    深入理解javascript原型和闭包.pdf

    JavaScript原型和闭包是这门语言中两个比较难以理解且与其他面向对象语言区别较大的概念。理解这两个概念,不仅能让我们更深层次地理解JavaScript,而且有助于我们了解编程语言的设计思路,拓宽我们的视野。 首先,...

    JavaScript 面向对象与原型

    8. 原型和构造函数结合: - 构造函数可以用来初始化对象的属性,而原型可以提供对象的共享方法。 - 通过`prototype`属性,我们可以为构造函数添加方法,这些方法将被所有实例共享。 总之,JavaScript的面向对象...

    JavaScript程序设计课件:原型与继承.pptx

    当访问某个对象中的一个不存在的属性或方法时,会自动调用原型中的属性和方法。也就是说,基于原型创建的对象会自动拥有原型的属性和方法。 之前我们学过构造函数,通过构造函数也可以使两个对象具有相同的属性和...

    强大的原型和原型链

    ### 强大的原型和原型链 #### 前言 JavaScript 的继承机制与传统面向对象语言(如 Java、C#)中的类继承不同,它采用了基于原型(Prototype-based)的继承模型。这种模型使得 JavaScript 在处理对象之间的继承关系...

    Web前端面试题目JavaScript(作用域,原型。原型链,闭包,封装函数).txt

    前端面试题,包含JavaScript的闭包,作用域,原型,原型链,上下文环境以及DOM,BOM封装函数深度克隆,以及一些常见的·JS问题,试题简单但是容易混淆,作为前端工程师必考题

    JavaScript中原型和原型链详解

    在理解原型和原型链时,需要注意构造函数和其prototype之间的关系,以及实例对象与它们之间的关系。原型链使我们能够构建更复杂和丰富的对象层次结构,通过继承和共享来扩展JavaScript对象的能力。 如果原型链中的...

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

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

    理解Javascript原型继承原理

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

    JavaScript FSO实现客户端XML文件读写.pdf

    通过使用JavaScript的FSO和DOM,我们可以实现客户端XML文件的读写,提高了系统的通用性和灵活性。这种方法可以应用于各种文本文件的读写,具有很好的通用性。 本文介绍了使用JavaScript的FSO和DOM来实现客户端XML...

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

    根据这个链接,JavaScript可以检查一个对象是否具有特定属性或方法,如果没有,则继续在原型链上查找,直到找到或链结束。 现在让我们来分析一个具体的原型继承例子: ```javascript function Gizmo(id) { this....

    使用 JavaScript 实现社交网络原型及其源代码.zip

    该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码...

    JavaScript中的prototype(原型)属性研究

    需要注意的是,现代浏览器和Node.js环境已经不再推荐直接修改或使用`__proto__`属性,而是应该使用`Object.setPrototypeOf`和`Object.getPrototypeOf`方法。 ### 原型和性能 虽然原型链提供了强大的继承机制,但...

    浅析JavaScript实现基于原型对象的“继承”.pdf

    通过对JavaScript的原型继承机制的介绍和实例分析,提出一个改进的“寄生组合模式”,使读者能够更好地理解和应用JavaScript的原型继承。 概述 JavaScript是一门面向Web的编程语言,具有高端、动态以及面向对象的...

    Electron项目:读写本地json文件,实现用户登录、修改用户信息,窗口最小化,最大化,关闭窗口

    在本Electron项目中,我们关注的是如何利用Electron框架创建一个桌面应用程序,该程序能够处理用户登录、信息修改,并且支持窗口的操作,如最小化、最大化和关闭。此外,项目还涉及到本地JSON文件的读写操作,以及在...

    JavaScript原型链简单图解

    JavaSciptDOM基本操作,JavaScipt函数基础,JavaScipt流程语句,JavaScript变量,JavaScript数据类型,JavaScript数组,JavaScript正则表达式,JavaScript字符串函数,Window对象等图解。JS高手进阶的工具图谱

Global site tag (gtag.js) - Google Analytics