理解Javascript的Prototype
在Javascript中创建对象主要分为三种方式
1、
var catA = {name: "Fluffy", color: "White", age: 0};
2、
var catB = Object.create(new Object());
catB.name = "Fluffy";
catB.color = "White";
catB.age = 0;
3、
function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 0; var catC = new Cat("Fluffy", "White");
每个函数都有个prototype属性,这是一个对象。如果访问一个对象的属性,首先会在对象内部查找,如果再对象内部中找不到这个属性,会到原型中去找,以此类推。通过每个对象会有一个__proto__来指向prototype。如果对象不是new出来的,则__proto__为{}如
catA.__proto__;
Object { }
catC.__proto__;
Cat {age: 0}
通过调用对象的hasOwnProperty可以判断非原型上定义的属性比如
catC.hasOwnProperty("name");
true catC.hasOwnProperty("color");
true catC.hasOwnProperty("age");
false
改变函数原型对象的属性,会引起对象属性的变化比如。因为有函数new出来的对象中的__proto__指向的是同一个对象即函数的prototype属性。
function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 3; var fluffy = new Cat("Fluffy", "White");
var scratchy = new Cat("Scratchy", "Black"); fluffy.age;
3 scratchy.age;
3 Cat.prototype.age = 4; fluffy.age;
4 scratchy.age;
4
如果对象已经早已被new出来了,后来又改变了构造该对象函数的原型。则不会影响到原来对象的属性变化,因为__proto__还是指向原来的那个对象。
function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 3; var fluffy = new Cat("Fluffy", "White");
var scratchy = new Cat("Scratchy", "Black"); fluffy.age;
3 scratchy.age;
3 Cat.prototype = {age: 4}; fluffy.age;
3 scratchy.age;
3 var muffin = new Cat("Muffin", "Brown"); muffin.age;
4
因为每个对象都有个__proto__属性来指向原型对象,因此如果改变通过该对象的__proto__可以改变原型的属性,从而影响其他已经或者即将new的对象。
function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 3; var fluffy = new Cat("Fluffy", "White");
var scratchy = new Cat("Scratchy", "Black");
Compare this example: fluffy.age = 4; fluffy.age;
4 scratchy.age;
3
To this example: fluffy.__proto__.age = 4; fluffy.age;
4 scratchy.age;
4
javascript 继承的实现
function Animal(name) {
this.name = name;
}
Animal.prototype.age=1; function Cat(name, color) {
Animal.call(this, name);
this.color = color;
}
Cat.prototype = new Animal(null); var catC = new Cat("Fluffy", "White"); catC.name;
Fluffy catC.color;
White catC.age;
1
理解Javascript的Prototype的更多相关文章
- 理解JavaScript的prototype和__proto__
首先,要明确几个点: 1.在JS里,万物皆对象. 方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__pro ...
- 深入理解javascript原型和闭包(3)——prototype原型
既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...
- 深入理解javascript原型和闭包(3)——prototype原型 (转载)
深入理解javascript原型和闭包(3)——prototype原型 既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的 ...
- 深入理解javascript原型和闭包 (转)
该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的两个部分--原型和闭包,当然,肯定少不了原型链和作用域链.帮 ...
- 深入理解javascript原型和闭包系列
从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然不至于上头条,但是也算是中规中矩,有看的人,也有评 ...
- 深入理解Javascript中构造函数和原型对象的区别
在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- 深入理解javascript原型和闭包(2)——函数和对象的关系
上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...
- 深入理解javascript原型和闭包(4)——隐式原型
注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...
随机推荐
- 关于网页中行内元素的基线(baseline)、行高(line-height)、垂直对齐(vertical-align)等
CSS基线之道 http://www.qianduan.net/css-baseline-road.html 垂直对齐:vertical-align属性 http://www.ddcat.net/bl ...
- 呕心沥血Android studio使用JNI实例
发现网上很多JNI的使用教程,也很详细,不过有的地方有些缺漏,导致很多小问题难以解决的,今天就来总结一下. 准备工作:下载NDK. 简单的说,要用到C/C++,就要用NDK.直接百度搜索然后去官网下载 ...
- 修改android Studio SDK 路径产生的问题(模拟器不能启动了)
原因:将 c:\user\admin\appdata\android\sdk 修改为 F:\AndroidProgram\Sdk 原来的虚拟机不能用了,要新建虚拟机才可以.
- python学习——练习题(13)
""" 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个" ...
- HALCON初步:算子参数部分三个冒号的意义
HALCON中存在两类基本变量:图像变量(iconic data)和控制变量(control data),其中图像变量包括image, region和XLD contours,控制变量包括intege ...
- 重写iframe内联框架中的内容
重写iframe内联框架中的内容,不使用src指向页面url,主动写入HTML代码: var ifr = document.getElementById("CMBC-certificatio ...
- 初识tornado
Tornado 参考: http://www.cnblogs.com/wupeiqi/articles/5702910.html Tornado 是 FriendFeed 使用的可扩展的非阻塞式 w ...
- vagrant+docker搭建consul集群开发环境
HashiCorp 公司推出的Consul是一款分布式高可用服务治理与服务配置的工具.关于其配置与使用可以参考这篇文章 consul 简介与配置说明. 一般,我们会在多台主机上安装并启动 consul ...
- mybatis 传入集合参数遍历 查询总结
出自:http://blog.csdn.net/u013628152/article/details/51184641 1. findByIds(List ids) 如果参数的类型是List, 则在使 ...
- spring中 Bean的装配 Bean后处理器