原型的作用
1,作用是:实现了同类对象之间的数据共享
2,最终实现继承,也就是实现了代码的复用
原型的基本概念
1,概念:函数对象的prototype属性,所引用的对象。
2,原型的本质就是对象。 一般函数都有prototype属性。也就是一般函数都有原型
3,声明一个函数时,原型随之产生。此时原型默认是一个空对象。但是具有一个默认属性。constructor,该属性指向其构造函数。
4,在原型上的成员(属性和方法),都可以被其实例访问。
获取原型的方式
1,通过函数: <fn>.prototype
2,通过对象:<object>.__proto__
3,非标准属性:以两个下划线开头和结尾的属性都是非标准的属性。在这里除了__proto__属性外,其他都不介绍。因为有它的存在,才有了原型链
原型的特性
1,共享性(继承性)
原型上的成员都可以被其实例直接访问。
2,不可变性
实例不可以直接修改原性上的任何成员
3,动态性
*如果在原有的原型上扩展成员,会直接反映到已创建的对象和之后创建的对象上
*如果替换了原有的原型,此时新原型的成员在之前已创建的对象是不能访问到的。在之后创建的对象是可以访问到的。
*如果置换了原形,就会在新的原型上丢失默认的constructor属性。如果想让其有该属性,就需要手动添加。
4,唯一性
所有的实例只能共享一个原型。
原型的称呼
1,原型属性:站在函数的角度,由于函数具有prototype属性,引用其原型,所以可以将其称之为原型属性
2,原型对象:站在对象或者原型本质上的角度。由于一般对象都有原型,所以可以称原型为该对象的原型对象
prototype属性和__proto__ 的联系与区别
1,prototype属性是函数所拥有的,可以获取到其原型
2__proto__属性是对象所拥有的,也可以获取到其原型。
3,两个属性都可以获取到原型。
5,构造函数执行的过程
1,创建一个空对象obj;
2,将上面创建的空对象obj赋值给this;
3,执行构造函数内部的代码块
4,隐式返回,即return this。
5,如果在构造函数中有显示的return语句,此时并不是所有的返回值类型都能够被返回
*如果返回值的类型是基本数据类型,在构造函数执行模式下,会被忽略。
*复合数据类型不会被忽略掉
继承
对象与对象之间的关系
1,概念:
继承就是指 一个对象a有权去访问另外一个对象b上的成员。此时就称,a对象继承自b对象
2,实现方式:
只要是一个对象能访问到另一个对象上的成员,这种方式就是继承方式。
继承的实现方式
1,原型式
* 扩展原型:如果想让某类对象具有一些方法或属性,就可以扩展其原型。这样这些对象就可以直接访问扩展的成员了
* 置换原型:通过替换原型 让实例继承自新的对象
2,混入式
将对象b上的成员拷贝一份添加到对象a上
hasOwnProperty方法
<对象>.hasOwnProperty('propertyName')
用来判断指定的属性是否为该对象自己拥有的,而不是继承下来的。
extend 方法
1,语法:extend([target,arg1,arg2,...]);
2,功能:给指定的对象实现混入式继承。
3,实现思路
*判断是否传入实参,如果没有传入实参,提前结束函数运行。
*如果只传入一个实参。将该传入的实参,作为extend方法的返回值
*否则,声明一个target变量,赋值为arguments 第一个元素
*从索引1 开始遍历arguments对象
*枚举遍历到的当前对象所有属性
*将当前属性扩展到target上
*将target作为extend方法的返回值
经典继承
1,ES5提供的方法Object.create();
2,语法: var o = Object.create(obj);
3,功能:制定一个要继承的对象,该方法会返回一个新对象。并继承自传入的新对象。
兼容性封装
if(!Object.create){
Object.create=function(obj){
function F(){
}
F.prototype=obj;
return new F();
}
}
对象
1,概念:无序的键值对集合;对象就是对现实世界中的某一类事物的抽象
2,创建方式
*字面量(直接量) var obj ={};
*通过构造函数 var obj=new Object();
*工厂模式:自己本身可能不具备创建该对象的能力,但是该函数会通过其他构造函数或字面量的形式创建一个对象。再将该对象返回即可。
#封装创建对象的过程,不需要用户关心怎么创建对象,只需要调用该方法得到对象即可。
#相对于构造函数模式,工厂模式有new和没new都能创建一个对象
#用途:在插件或框架开发时,经常使用工厂模式创建对象
面向对象(思想)自己不想干事,叫别人去干
1,定义:在实际开发的时候,要完成某个功能首先要考虑是否已有某个对象可以完成该功能。如果有,直接使用该对象帮助完成功能。如果没有,要考虑该功能是否要实现复用,如果是,此时最好的实现方式为创建一个对象,让改对象实现功能。
面向对象三大特性
1,封装性 private public protected
2,继承性:传统面向语言是指 类(class)与“类”之间的关系,二js中是指对象与对象之间的关系
在js中继承是指 一个对象有权去访问另一个对象的成员(属性和方法)
3,多态性: 体现在继承模型下,不同的对象继承自同一个对象的某一个方法。此时,该方法再具体的对象上的表现行为不同。
网友评论