蛀牙--《设计模式---通往未来的很高的台阶之(四)》

来源:互联网 发布:儿童毛毯牌子什么知 编辑:程序博客网 时间:2024/04/28 11:54

js中的原型继承

1、所有的数据都是对象

js在设计的时候,模仿了Java引入了两套类型机制:基本类型和对象类型。基本类型包括啥呀???

提问——-???
undefined 、number、Boolean、string、function、object。

按照JavaScript设计者本意,除了undefined之外,一切都应是对象。number boolean string这几种基本类型数据也可以通过“包装类”的方式变成对象类型数据来处理。

事实上,js中的跟对象是Object.prototype对象。他是一个空对象,我们在js中遇到的每个对象,实际上都是从Object.prototype对象克隆来的。Object.prototype对象就是他们的原型。

举个栗子
这里写图片描述

var obj1 = new Object();var obj2 = {};console.log( Object.getPrototypeOf( obj1 ) === Object.prototype ); //trueconsole.log( Object.getPrototypeOf( obj2 ) === Object.prototype ); //true

2、要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并且克隆他

js和Io是不同的,js的克隆是引擎内部实现的,我们看不到克隆的过程。我们最终得到的就是一个对象

再举个栗子
这里写图片描述

function Person( name ){    this.name = name;};Person.prototype.getName = function(){   return this.name;}var a = new Person('sven')console.log(a.name);  //输出svenconsole.log(a.getName() ); //输出svenconsole.log(Object.getPrototyprOf( a ) === Preson.prototype ); //输出true

我们用new从构造器中得到一个对象。有人说 用了new了 ,这不是类的概念吗?
我们已经一再强调了js中是没有类的概念的,这里的Person并不是类,而是函数构造器,js中的函数既可以作为普通函数被调用,也可作为构造器被调用。当用new运算符来调用函数时,此时函数就是一个构造器

3、对象会记住他的原型

其实并不能说对象有原型,而只能说对象的构造器有原型。对于对象吧请求委托给它自己的原型 这句话,更好的解释就是对象把请求委托给他的构造器的原型,。那么对象如何把请求顺利地装交给他的构造器的原型呢????

js给对象提供了一个名为 _ proto _ 的隐藏属性。某个对象的 _ proto _ 属性默认会指向他的构造器的原型对象。即 {Construcrot}.prototype。 在一些浏览器中,_ proto _ 被公开出来。例如谷歌或者火狐

var a = new Object();console.log(a._proto_ === Object.prototype); ///输出  true

4、如果对象无法响应某个请求,他会把这个请求委托给他的构造器的原型

在js中,每个对象都是从Object.prototype对象克隆来的,如果这样的话,我们只能得到单一的继承关系。即每个对象都继承自Object.prototype。

但是js在设计时,对象最初是Object.prototype对象克隆来的,但对此昂构造器的原型并不仅仅限于Object.prototype上。而是可以动态指向其他对象。这样一来,当对象a需要借用b的能力时。就可以选择性的吧对象a的构造器的原型指向对象b,从而达到继承的效果。

var obj = {name:'sven'};var A = function(){};A.prototype = obj;var a = new A();console.log( a.name );   //输出:sven

以上就是最常用的原型继承方式

当我们希望得到一个类继承自另一个类时该如何操作

var A = function(){};A.prototype = { name:'sven' };var B = function(){};B.prototype = new A();var b = new B();console.log( b.name ); //输出 seven

这里写图片描述
以上代码的流程解释::
首先,尝试遍历对象b中所有的属性,没有找到name这个属性,接着查找name的请求被委托给对象b的构造器的原型。他被b._ proto _记录着并且指向B.prototype。而B.prototype被设置为一个通过new A()创建出来的对象。于是请求被委托给这个对象那个的构造器原型A.prototype。在这里找到了name属性,并打印出他的值。。

===============过程很重要=================

提问 —–原型链是无限长的吗 欢迎评论解答


自此以上 设计模式中的 ———原型模式就介绍完了。原型模式是一种设计模式,也是一种编程泛型,它构成了js这门语言的根本。原型模式十分重要,和JavaScript开发者密切相关。。


人之所以弱小是因为还有缺陷 ——《蛀牙》

阅读全文
0 0