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也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的 ...
随机推荐
- DOM tiny-demo
<script type="text/javascript" language="javascript">var i = 4; function a ...
- 引用类型(JavaScript第5章)
引用类型的值(对象)是引用类型的一个实例.在ECMScript中,引用类型是一种数据结构,用于将数据和功能组织在一起. 一.Object类型 创建Object实例的方式有两种.第一种是使用new操作符 ...
- php在字符串中替换多个字符
php替换多个字符串str_replace函数 echo str_replace(array("m","i"),array("n",&quo ...
- Unity3D for iOS初级教程:Part 1/3
转自Unity 3d for ios 这篇文章还可以在这里找到 英语 Learn how to use Unity to make a simple 3D iOS game! 这篇教材是来自教程团队成 ...
- 【bzoj4868】[Shoi2017]期末考试 前缀和+暴力
题目描述 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待 ...
- Codeforces Round #360 (Div. 2)——C. NP-Hard Problem(BFS染色判二分图)
C. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- BZOJ 4128 Matrix ——BSGS
矩阵的BSGS. 只需要哈希一下存起来就可以了. 也并不需要求逆. #include <map> #include <cmath> #include <cstdio> ...
- 51nod1053 最大M子段和 V2
$n \leq 50000$的序列,问选不超过$m \leq 50000$个区间使得和最大. 如果正数区间总数比$m$小那肯定全选.否则有两种方式减少区间数量:丢掉一个正区间:补一个负区间连接两个正区 ...
- *AtCoder Grand Contest 002F - Leftmost Ball
$n \leq 2000,k \leq 2000$,现$n$种球每种有$k$个,在一种排列中,会把每种颜色的球第一个出现的涂成第0种(不同于原来的n种)颜色,问最终会出现多少种不同的序列.膜1e9+7 ...
- DP的序--Codeforces626F. Group Projects
$n \leq 200$个数,$ \leq 500$,$K \leq 1000$代价内的数字分组有多少?一个分组的代价是分成的每个小组的总代价:一个小组的代价是极差. 问的极差那就从极入手嘛.一个小组 ...