在JS中,每当建立一个函数对象f1 时,该对象中都会内置一些属性,其中包括prototype和proto, prototype即原型对象。数组
每个构造函数都有一个与之相关联的对象,该对象称之为原型对象。
每一个实例对象都能共享其原型对象上的属性和方法。
原型对象的做用主要用来实现属性的继承,让实例对象能共享原型对象的属性,减小内存分配。
因此,在上一节中,咱们想在每一个Person对象中共享同一个say方法,能够这样来实现。
function Person(name, age) {
this.name = name;
this.age = age;
}//在原型对象上添加say函数,实例对象共享该函数
Person.prototype.say = function(){
console.log("say hello");
};var p = new Person("zs", 10, say);
p.say();var p2 = new Person("zs", 10, say);
p2.say();
在原型对象上添加成员的方法:
构造函数.prototype.成员名 = 成员值;
为Person原型对象添加say方法后,实现了在多个实例对象上共享该方法的功能。
获取原型对象的方法:
构造函数.prototype
实例对象. proto
在每一个实例对象上都有一个 proto 的属性,也是用来获取该对象的原型对象。
Person.prototype == p. proto ;//true
下图详细说明了各对象之间的关系:浏览器
面向对象中的核心概念
构造函数:Person,和new关键字一块儿建立对象
构造函数的原型对象:Person.prototype,
原型对象:和建立实例对象的构造函数相互关联的对象
实例对象:由构造器建立出来的对象称之为实例对象
实例化:由构造器建立实例对象的过程称之为实例化
对象的成员:属性+方法
实例成员:实例对象上的属性和方法,name,age,只能当前实例对象才能访问
原型成员:原型对象上的属性和方法,say(),使用该原型对象对应构造器建立出来的全部实例对象都能访问
静态成员:直接添加在构造函数上的属性和方法,只能使用构造函数才能访问
proto 属性介绍
该属性是在ES6以后才归入规范,在这以前,只有部分浏览器实现。
该属性能够获取指定实例对象的原型对象,p. proto ,和Person.prototype获取的同样
咱们也可使用Object构造器上的getPrototypeOf(实例对象)方法获取指定实例对象的原型对象
以上提到的三种获取原型对象的方法所获得的结果是同样的。即:
Object.getPrototypeOf(p) == Person.prototype == p. proto
扩展内置对象
内置对象是JS中事先定义好的对象,能够直接拿来使用的对象,在这类对象中已经封装好了一堆的方法和属性,方便开发者完成基本的功能。
可是在实际开发中,这些属性或者方法不必定可以知足咱们的需求,此时就须要对这些内置对象作功能扩展。
需求:为数组对象添加一个获取元素个数的方法
var arr1 = [1, 2, 3];var arr2 = ["A", "B", "C","D"];
arr1.getLength = function () {
return this.length;
}console.log(arr1.getLength());
上面为数组arr1添加了一个getLength()方法获取其元素个数,那么此时的arr2对象上有这个方法吗?相信你们内心都有答案。若是想要arr2拥有一样的功能,也须要一样的操做。
因此这种方式不可取,若是100个数组都想都须要这样的功能,操做起来就比较复杂了。
根据前面学过的知识点,咱们彻底可使用原型来解决这个问题。
var arr1 = [1, 2, 3];var arr2 = ["A", "B", "C","D"];Array.prototype.getLength = function () {
return this.length;
}console.log(arr1.getLength());// 3console.log(arr2.getLength());// 4
咱们直接在Array的原型对象上添加getLength()方法,以后建立的全部的数组对象都拥有了该方法,搞定!
这种方式可以解决咱们的问题,可是仍是存在问题的:安全
若是你仔细的读完本文,相信你对 JavaScript 中的原型,原型链会有新的认识。若是还想了解更多JS相关干货,记得持续关注个人更新!markdown