javascript 中的原型继承
javascript圆形变成的基本规则:
- 所有数据都是对象;
- 要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它;
- 对象会记住它的原型;
- 如果对象无法响应某个请求,它会把这个请求委托给它自己的原型;
- 所有的数据都是对象
- 在javascript的类型中,分为两类:基本类型和复杂类型;
基本类型包括:undefined、number、boolean、string、null;基本类型可以通过包装类的方式变成对象类型数据来处理;
复杂类型:object;
1.1 包装对象:所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。
1.2 包装类和基本类型的对应关系:
| 基本类型 | 包装对象 |
| string | String |
| number | Number |
| boolean | Boolean |
var v1 = new Number(123);
var v2 = new String("abc");
var v3 = new Boolean(true); typeof v1;//object
typeof v2;//object
typeof v3;//object v1 === 123;//false
v2 === "abc";//false
v3 ===true;//false
1.3Number、String和Boolean如果不作为构造函数调用(即调用时不加new),常常用于将任意类型的值转为数值、字符串和布尔值。
1.3.1 Boolean函数类型转换
Boolean(undefined);//false
Boolean(null);//false
Boolean(0);//false
Boolean("");//false
Boolean(NAN);//false Boolean(1);//true
Boolean('false');//true
Boolean([]);//true
Boolean({});//true
Booleam(function(){});//true
Boolean(/foo/);//true
使用双重的否运算符(!)也可以将任意值转为对应的布尔值。
!!undefined //false
!!null //false
!!0 //false
!!'' //false
!!NAN //false
!!1 //true
!!'false' //false
!![] //true
!!{} //true
!!function(){} //true
!!/foo/ //true
最后,对于一些特殊值,Boolean对象前面加不加new,会得到完全相反的结果,必须小心
1.4 javascript中的根对象是Object.prototype对象;
Object.prototype是一个空对象,我们遇到的每一个对象,都是从Object.prototype对象克隆而来的;
var obj1 = new Object();
var obj2 = {};
console.log(Object.getPrototypeOf(obj1) === Object.prototype); //true
console.log(Object.getPrototypeOf(obj2) === Object.prototype);//true
ECMAScript5提供的Object.getPrototypeOf 来查看对象的原型;
- 要得到一个对象,不是通过实例化类,而是找一个对象作为原型并克隆它
2.1 在javascript语言里,我们并不关心克隆的细节,因为这是引擎内部实现的。我们所需要的只是显示地调用var obj = new Object()或者var obj2 = {}。此时,引擎内部会从Object.prototype上克隆一个对象出来,我们最终得到的就是这个对象。
function Person(name){
this.name = name;
};
Person.prototype.getName = function(){
return this.name;
};
var a = new Person("seven");
console.log(a.name);//seven
console.log(a.getName);//seven
console.log(Object.getPrototypeOf(a) === Person.prototype);//true
补充解释:Person并不是类,而是构造函数,Javascript的函数既可以作为普通函数被调用,也可以作为构造器被调用。当时用new运算符来调用函数的时候,此时的函数就是一个构造器。用new运算符来创建对象的过程,实际上也只是先克隆Object.prototype对象,再进行一些其他额外操作的过程。
2.2 _proto_属性
2.2.1 在chrome和firefox等向外暴露了_proto_属性的浏览器下,我们可以通过下面这段代码来理解new 运算的过程
function Person(name){
this.name = name;
};
Person.prototype.getName = function(){
return this.name;
}
var objectFactory -= function(){
var obj = new Object(); //从Object.prototype上克隆一个空对象
var Constructor = [].shift.call(arguments); //call 的意思是把 空数组的方法放到arguments上执行,原来arguments是没有shift() 方法,现在是把空数组 的shift()方法放到 arguments上来执行,所以argument原来的第一个元素的值(Person)。
obj._proto_ = Constructor.prototype; //obj._proto_ = Person.prototype;
var ret =Constructor.apply( obj, arguments)
// Function.apply(obj,args)方法能接收两个参数
// obj:这个对象将代替Function类里this对象 (这个对象继承Function里的属性和方法)
// args:这个是数组,它将作为参数传给Function(args-->arguments)
return typeoof ret === 'object' ? ret : obj;
}
var a = objectFactory(Person, 'seven');
console.log(a.name);//seven
console.log(a.getName());//seven
console.log(Object.getPrototypeOf(a) === Perso.prototype); //true
- 对象会记住它的原型
3.1Javascript语言中的原型链查找机制,每一个对象都会记住自己的原型
3.2 “对象的原型”,就javascript的真正实现来说,并不能说对象有原型,而只能说对象的构造器有原型,对于“对象对吧请求委托给它的原型”这句话,更好的说法是对象把请求委托给了他的构造器的原型。
3.3 Javascript给对象提供了一个名为_proto_的隐藏属性,摸个对象的_proto_属性默认会指向它的构造函数的原型对象,即{Constructor}.prototype,在一些浏览器中,_proto_被公开出来,在chrome或者firefix上用这段代码来验证
var a = new Object();
console.log(a._proto_ === Object.prototype );//true
实际上,_proto_就是对象跟“对象构造器的原型”联系起来的纽带。
- 如果对象无法响应某个请求,他会把这个请求委托给他的构造器

Person原型对象也是对象,当这个对象找不到某个属性时,会到Object原型对象中去找,这就是原型链

关于对象的其他东西,请关注后续后续文章
javascript 中的原型继承的更多相关文章
- 理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...
- javascript中的原型继承
在Javascript面向对象编程中,原型继承不仅是一个重点也是一个不容易掌握的点.在本文中,我们将对Javascript中的原型继承进行一些探索. 基本形式 我们先来看下面一段代码: <cod ...
- JavaScript中的原型继承原理
在JavaScript当中,对象A如果要继承对象B的属性和方法,那么只要将对象B放到对象A的原型链上即可.而某个对象的原型链,就是由该对象开始,通过__proto__属性连接起来的一串对象.__pro ...
- Javascript中的原型继承具体解释
js中的继承,是面向对象的知识,由于js没有类的概念.所以继承是通过对象实现的.谈到继承.就必须说到prototype,就不得不先说下new的过程. 一个小小的列子: <script type= ...
- JS中的原型继承机制
转载 http://blog.csdn.net/niuyongjie/article/details/4810835 在学习JS的面向对象过程中,一直对constructor与prototype感到很 ...
- JavaScript中一个对象如何继承另外一个对象
如题,JavaScript中一个对象a如何继承另外一个对象b.即将b中的属性和方法复制到a中去. 面试中遇到了这个问题,当时脑子里的想法是: 1.除了循环遍历复制,还能怎样 2.javascript中 ...
- 【转】JavaScript中的原型和继承
请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...
- 深入了解JavaScript中基于原型(prototype)的继承机制
原型 前言 继承是面向对象编程中相当重要的一个概念,它对帮助代码复用起到了很大的作用. 正文 Brendan Eich在创建JavaScript时,没有选择当时最流行的类继承机制,而是借鉴Self,用 ...
- 图解JavaScript中的原型链
转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...
随机推荐
- python 字符串替换、正则查找替换
import re if __name__ == "__main__": url = " \n deded<a href = "">这是第 ...
- 因为没有安装xcode,得不到xcode证书报错
新接的一个项目.在从gitlab上clone代码的时候报错: Agreeing to the Xcode/iOS license requires admin privileges, please r ...
- 脚本语言 ES
C# 编写,解释执行,语法类似 JS,动态类型,支持闭包,支持热更新,效率比较低,目前暂时没有发现 BUG,实际游戏运行稳定,没有发现内存泄漏 Github:https://github.com/ea ...
- .NET 控件的认识。
四单元的题目里面,涉及了很多之前没有用过的控件的使用,前12道题都不是很难,所以很快做完了 ,但是后面的因为timer控件找不到,有些操作无法实现,所以就没做,但是也是认真的看了的. 等什么时候把ti ...
- 【转】Binlog 基本操作
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. 一般 ...
- 版本控制commit和update过程
很早就使用了git.后来还管了一个VSS,但长时间以来git和VSS基本都当ftp使用,顶多知道其有回退旧版本的功能,但对“版本控制”这个词一直以来都没领会其内含. 比如我一直担心两个问题,一是拉取下 ...
- SpringBoot是什么,可以做什么?
SpringBoot简析 1.SpringBoot是什么? 在Spring框架这个大家族中,产生了很多衍生框架,比如 Spring.SpringMvc框架等,Spring的核心内容在于控制反转( ...
- 运用python发邮件
1.网上有许多发送邮件的代码,运行了几次都不成功(使用python3),转用Python2之后,发送成功 2.代码样例: 参考教程:http://www.runoob.com/python/pytho ...
- Nuget连接失败的问题
---恢复内容开始--- .net 项目开发管理中我们经常使用Nuget管理我们的类库.由于某些原因 nuget v3的镜像源https://api.nuget.org/v3/index.json 经 ...
- ubuntu 系统开机执行脚本设置
在ubuntu 系统中常常有一些操作需要开机时手动去执行,有一些固定的脚本文件可以通过改写启动项脚本让系统启动时自动执行 方法: 编辑/etc/下的rc.local脚本,把对应的需要执行的脚本写在ex ...