构造函数是一种特殊的函数,主要用来初始化对象,为对象成员赋初始值,它与new 一块儿使用。通常用于将公共属性和方法抽取出来,封装到函数中。javascript
new 在执行时会作四件事:java
class Person { constructor(name, age){ this.name = name this.age = age } say(){ console.log('my name is ' + this.name) } } const jack = new Person('jack', 20) jack.say() // 打印 my name is jack
构造函数存在的问题:函数
若是直接在构造函数上添加方法,每次new一个新对象,会单独开辟一块新的内存空间。因为方法是通用的,每次new新对象都占用部份内存资源比较冗余浪费内存空间。所以在构造函数中定义方法通常会定义在它的原型链上,让全部new出来的新对象共享同一个对象上的方法。ui
构造函数的原型this
每一个函数都有一个prototype 属性,这个prototype也是一个对象, 是JavaScript默认添加的,通常把这个对象称之为原型对象。而构造函数拥有这个原型对象全部的属性和方法。spa
构造函数经过原型对象分配的函数是全部new出来的新对象共享的。所以在使用中咱们能够把一些不变的方法直接定义在prototype对象上,让全部对象实例共享这些方法。prototype
function Person(name){ this.name = name } Person.prototype.say = function(){ console.log('打印', 'my name is ' + this.name) } const jack = new Person('jack') jack.say() // 打印 my name is jack
对象原型code
__proto__
的属性,指向构造函数的prototype
原型对象。对象能使用构造函数的的原型对象prototype上的属性和方法,就是由于__proto__
原型的存在。__proto__
对象原型和 prototype
构造函数原型是等价的。__proto__
对象原型的意义在于为对象的查找机制提供一个方向,或者说一条路线。可是它是一个非标准属性,在实际开发中,不可使用这个属性,他的做用只是指向内部函数原型prototypeconst obj = {name : 'xiaowang'} console.log('打印', obj) // 打印 Object name: "xiaowang" __proto__: constructor: ƒ Object() __defineGetter__: ƒ __defineGetter__() __defineSetter__: ƒ __defineSetter__() hasOwnProperty: ƒ hasOwnProperty() __lookupGetter__: ƒ __lookupGetter__() __lookupSetter__: ƒ __lookupSetter__() isPrototypeOf: ƒ isPrototypeOf() propertyIsEnumerable: ƒ propertyIsEnumerable() toString: ƒ toString() valueOf: ƒ valueOf() toLocaleString: ƒ toLocaleString() get __proto__: ƒ __proto__() set __proto__: ƒ __proto__()
constructor 构造函数对象
__proto__
)和构造函数原型(prototype)里面都有一个constructor属性。constructor 称之为构造函数,它指回构造函数自己。function fn(){} console.log("打印", fn.prototype ); // 打印 {constructor: ƒ} constructor: ƒ fn() __proto__: Object console.log('打印', tom.__proto__) // 打印 {constructor: ƒ} constructor: ƒ Person(name) __proto__: Object
原型链ip
1.构造函数的原型protoptype指向Object的原型,Object的原型__proto__指向null。 2.对象实例的原型__proto__指向构造函数的原型prototype。
方法与属性的查找规则
查找对象自己的__proto__
上的方法 => 查找原型对象prototype
上的方法 => 查找Object对象的__proto__
上的方法,若是Object上没有则指向 null