对于面向对象,我的理解是第一先构造函数,第二往这个构造函数自带的prototype属性里添加属性,第三,new这个函数创建一个对象,然后使用这个对象里的属性,下面就详细来理解一下~
- 声明函数
function home(name){
this.name = name
}
这时这个构造函数里还会出现一个prototype
的属性,这是每个函数都自带的属性;
- 向这个函数的
prototype
属性添加你所需要的属性
home.prototype.baba = function(){console.log(`我是${this.name}`)}
- 创建一个对象,即new这个构造函数,那么这个对象的
_proto_
属性就被设置为这个构造函数的prototype
的属性了(因为对象本身就具有_proto_
属性,new home时,_proto_
就成为home.prototype
;new people时,_proto_
就成为people.prototype
)
var h = new home('a')
h.baba() // 'a'
- 当new一个函数时,会发生什么呢?
①创建一个空对象,把这个空对象的_proto_
属性设置为这个函数的prototype
;
②执行这个函数,此时这个函数里面的this
代表刚刚创建的这个新对象
③返回这个对象,如果构造函数中有return,return的是基本类型的话就忽略不计,但是return的是引用类型(对象、数组之类的),那么就返回这个引用类型,不过应该也没有人无聊到在构造函数里return东西出来
记住:函数本身有
prototype
属性,对象本身有_proto_
属性,函数的prototype
属性对应的值是一个对象,叫做原型对象,这个原型对象可以被这个函数new出来的所有对象共享
有了这个原型之后,我们可以把用到的属性都写到这个原型中,每次只需创建不同的对象,这两个对象虽然功能都一样,但却是完全独立的两个组件,这就是组件化
-
原型图