NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[TOC] ## JavaScript原型,原型链 所有的实例对象都可以继承构造器函数中的属性和方法。但是,同一个对象实例之间,无法共享属性,浪费内存资源。 ~~~ function Person(name,age){ this.name = name; this.age = age; this.sayHello = function(){ console.log(this.name + "say hello"); } } var girl = new Person("bella",23); var boy = new Person("alex",23); console.log(girl.name); //bella console.log(boy.name); //alex console.log(girl.sayHello === boy.sayHello); //false ~~~ ![](https://box.kancloud.cn/4b6049e2fa83f33fa65d0613f6861fdd_512x369.png) > 由sayHello的==结果看出,New的实例中sayHello方法并不是同一个方法。实际上New一个实例对象的时候,就会创建一个sayHello方法,这样会浪费内存资源。 所以我们将方法写在原型上。(js中每个数据类型都是对象,除了null 和 undefined,而每个对象都是继承自一个原型对象 ) ~~~ function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function () { console.log(this.name + ":balabala"); } var girl = new Person("bella", 23); var boy = new Person("alex", 23); console.log(girl.sayHello === boy.sayHello); //true ~~~ ![](https://box.kancloud.cn/9261961e81faf5feb504e2f54fcedc6c_636x595.png) > 给Person的prototype一个sayHello方法,Person、girl、boy都可以使用该方法。 * * * ### Person.prototype到底是什么?\_\_proto\_\_又是什么? > propotype是构造函数的属性(实例化对象没有该属性),指向该构造函数的原型。 > \_\_proto\_\_是JS创建的对象的内置属性(指针),用于指向创建它的构造函数的原型对象。 ![](https://box.kancloud.cn/28246bce1dcd23e26320dd7d9c8b9d0c_458x464.png) ~~~ console.log(Person.prototype);//找到上一级,找到父亲辈 console.log(girl.__proto__);//相当于向上跳了两级,找到爷爷辈 //console.log(girl.__proto__ === Person.prototype);//true ~~~ ![](https://box.kancloud.cn/7772977441b225dc7b5ecf379ac77f38_350x408.png) * * * ### constructor是什么? > constuctor是原型对象的属性。 ~~~ console.log(Person.prototype.constructor===Person);//true ~~~ constructor属性是定义在原型对象上面,意味着也可以被实例对象继承 ~~~ console.log(Person.constructor);//Function console.log(girl.constructor);//Person ~~~ 每个对象在创建时都会因为原型对象的继承关系,自动拥有一个constructor属性,指向其构造函数。 因此,我们下面这条语句的结果为true ~~~ console.log(girl.constructor === girl.__proto__.constructor);//true 左边使用的是:实例girl从原型对象继承下来的constructor属性 右边使用的是:实例girl的构造函数的原型对象自有的constructor属性 ~~~ * * * ### 原型链:所有对象皆有\_\_proto\_\_属性,它指向它构造函数的原型对象,它们最终指向Object ~~~ console.log(girl.__proto__); ~~~ ![](https://box.kancloud.cn/85d973df32e119d36e777ed8b613b561_435x581.png) ~~~ 实际上,我们执行以下代码就可以验证,所有对象的原型都指向object console.log(Person.__proto__); console.log(Function.__proto__); console.log(Object.__proto__); ~~~ ![](https://box.kancloud.cn/7a7835d4df0b861551c7a1e367dfb34c_235x89.png)