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
javascript读取和改动原型特别须要注意的事儿,由于原型的读写不具有对等性的更多相关文章
- 【JavaScript】 JS面向对象的模式与实践 (重点整治原型这个熊孩子 (/= _ =)/~┴┴ )
参考书籍 <JavaScript高级语言程序设计>—— Nicholas C.Zakas <你不知道的JavaScript> —— KYLE SIMPSON 在JS的面向 ...
- 简单使用JSON,JavaScript读取JSON文本(三)
JavaScript 读取 JSON 文本转换为对象 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 Jav ...
- JavaScript提高篇之面向对象之单利模式工厂模型构造函数原型链模式
1.单例模式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- JavaScript进阶(六)用JavaScript读取和保存文件
用JavaScript读取和保存文件 因为Google还不提供同步插件数据的功能,所以导入和导出插件配置就必须和文件打交道了.而出于安全原因,只有IE才提供访问文件的API:但随着HTML 5的到来, ...
- javascript读取xml文件读取节点数据的例子
分享下用javascript读取xml文件读取节点数据方法. 读取的节点数据,还有一种情况是读取节点属性数据. <head> <title></title> < ...
- JavaScript 读取修改元素 及 伸拉门案例
JavaScript 读取修改元素 及 伸拉门案例 版权声明:未经授权,严禁转载! 读取 / 修改元素 - 读取修改元素内容 - 读取修改元素属性 - 读取修改元素样式 元素的内容 读取或修改元素节点 ...
- JavaScript读取本地json文件
JavaScript读取本地json文件 今天调试了一上午,通过jQuery读取本地json文件总是失败,始终找不出原因,各种方法都试了 开始总以为是不是json格式的问题.高了半天不行 后来读了一个 ...
- 深入JavaScript对象(Object)与类(class),详细了解类、原型
JavaScript基于原型的对象机制 JavaScript原型上的哪些事 一.JavaScript基于原型的对象机制 JavaScript对象是基于原型的面向对象机制.在一定程度上js基于原型的对象 ...
- 深入理解javascript原型和闭包(3)——prototype原型 (转载)
深入理解javascript原型和闭包(3)——prototype原型 既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的 ...
随机推荐
- Android AAR 混淆的坑
一定不要忘记加上这段 -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,A ...
- 【SaltStack】SaltStack研究心得
基础篇 ------------------------------------------------------------------------------------------------ ...
- 关于springmvc返回json格式数据
1.引入maven依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifac ...
- 【19】javascript有哪些方法定义对象
创建Object的方式有4种. 方式一: 通过对象字面量表示法(又称为直接量.原始方式). var obj = {name:"moyu"}; 方式二: 通过new和构造函数Obje ...
- Educational Codeforces Round 31
A. Book Reading time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 【java基础 11】java集合框架学习
导读:本篇博客主要是从整体上了解java的集合框架,然后主要介绍几个自己在项目中用到的结构,比如说:hashtable.hashmap.hashset.arraylist等! 一.宏观预览 从宏观上看 ...
- BZOJ 4259 残缺的字符串 ——FFT
[题目分析] 同bzoj4503. 只是精度比较卡,需要试一试才能行O(∩_∩)O 用过long double,也加过0.4.最后发现判断的时候改成0.4就可以了 [代码] #include < ...
- SPOJ GSS6 Can you answer these queries VI ——Splay
[题目分析] 增加了插入和删除. 直接用Splay维护就好辣! 写了一个晚上,(码力不精),最后发现更新写挂了 [代码] #include <cstdio> #include <cs ...
- Docker镜像分层技术
Docker镜像管理 1.镜像分层技术 2.创建镜像 3.下载镜像到主机 4.删除镜像 5.上传镜像到registry docker镜像: 早在集装箱没有出现的时候,码头上还有许多搬运的工人在搬运货物 ...
- ifame标签
一 w3c网址 http://www.w3school.com.cn/tags/tag_iframe.asp 二 iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 三 页面显示及代码 ...