2017年4月18日09:01:32
原型:prototype (面向对象)
prototype:在js中,任何一个函数,都有一个prototype属性,指向一个对象,输出这个函数的prototype属性,你会发现一个空对象,输出这个prototype的类型是一个object。
1:原型做用:一个函数的原型,对于普通函数,没有做用,可是若是函数是一个构造函数,name函数的原型,有很是大的做用,具体以下
//当一个函数被new出来的时候,不单单执行了构造函数里面的语句,也会把这个函数的proto——(原型对象)指向构造函数的proto。
var xiaoming = new People();
console.log(xiaoming.__proto__);
console.log(xiaoming.__proto__==People.prototype);
// 当咱们访问那么,age的时候,构造函数返回的对象自己没有,那么就去查找原型,原型若是有就拿来当作本身的属性。
console.log(xiaoming);
prototype必定使函数的属性。只能使用函数名调用赋值,当这个函数是一个构造函数的时候,那么new出来的对象将以他的原型那个对象为new出来的实例的原型对象。
任何一个对象都有__proto__属性,这个只是chrome的属性,别的不兼容,别的浏览器不能经过__proto__进行访问.
原型查找:是js里面很重要的一个机制。当咱们要访问一个对象自己的属性的时候,若是这个对象身上有这个属性,直接返回值,若是没有这个属性,将访问它的原型对象。
prottype:原型,构造函数的属性,只有函数有原型。
__proto__原型对象,任何对象都有原型对象。:
那么__proto__是什么?咱们在这里简单地说下。每一个对象都会在其内部初始化一个属性,就是__proto__,当咱们访问一个对象的属性时,若是这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有本身的__proto__,因而就这样一直找下去,也就是咱们平时所说的原型链的概念。
按照标准,__proto__是不对外公开的,也就是说是个私有属性,可是Firefox的引擎将他暴露了出来成为了一个共有的属性,咱们能够对外访问和设置。
2:原型的用途:
原型优势
若是不用原型,那么new的时候每个对象都会复制一份构造函数里面的属性,多个对象会占用很大的内存。若是使用原型设置属性,全部对象都只调用一个函数,能够节省空间。
3:原型链查找
1)constructor:函数的原型有constructor属性,是原型的属性,这个属性值是原型的构造函数,
原型是实例的原型对象,构造函数是构造函数的原型构造器,经过构造函数才创造出一个构造函数的原型,构造函数的原型是一个对象,经过new函数制造出来的实例化对象的原型都是构造函数的原型
构造函数《==》原型
object用于创造对象,它是系统内置的构造函数,object。prototype是全部对象的原型链终点,因此当使用对象点语法调用某个函数的时候,系统会沿着原型链寻找定义,一直到Object。prototype
数组的原型链:
JS在建立对象(不管是普通对象仍是函数对象)的时候,都有一个叫作__proto__的内置属性,用于指向建立它的函数对象的原型对象prototype。
在js中,面向对象技术,已经变成了组织代码的方式,这种方式叫作组件开发。
继承:
//函数不调用不会本身执行
// 把人类的全部属性给了学生类
this.constructor.apply(this,arguments);
this.xuehao = xuehao;
this.flowernum = flowernum;
}
//继承的核心语句
// 把人类的方法给了学生类
Student.prototype = new People();
// 下面这种状况会改变父类原型中的相同方法
// Student.prototype = People.prototype;(不建议使用)。
for,,in 循环能够将原型链上全部能够枚举的东西列举出来。for(var k in obj)
in运算返回的是一个布尔值,系统默认例如constructor等属性是不可枚举的。for in能够把本身添加的属性罗列起来,也能够将原型链上全部的属性罗列。
hasOwnProperty用来验证这个属性在不在当前obj里面,不会顺着原型链爬。只能输出当前在这个obj里面的。
直接使用点语法判断属性是否是在obj里面若是是underfined说明不在。 不然返回属性值。点语法会遍历原型链
instanceof运算符
类:class
实例:instance A instanse B 验证A是否是B的实例
//数组的构造函数自带的方法 (ie9以后开始兼容)ECMAScript5标准中新增的一个API验证数组。
var arr = [];
console.log(arr instanceof Array);//true
console.log(typeof arr);//object
console.log(arr instanceof Object);//true
console.log(Array.isArray(arr));//true
运算机理:
遍历HelloKit这个对象原型链上的每一个原型对象,若是遍历到这个原型对象是某个构造函数的Prototype,那么hellokit也是这个构造函数的实例。
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例。可是在Javascript语言体系中,
是不存在类(Class)的概念的,javascript中不是基于‘类的’,而是经过构造函数(constructor)和原型链(prototype chains)实现的。
所谓属性,就是对象的一种状态;所谓方法,就是对象的一种行为。
Cat.prototype = new Dog();cat继承了dog的属性。