构造函数和原型
构造函数 是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋值,它总于new一起使用。我们可以把对象中的一些公共的属性和方法抽取出来,然后封装到这个函数里面
在js中,使用构造函数时要注意以下两点:
1.构造函数用于创建某一类对象,其首字母要大写
2.构造函数要和new一起使用才有意义
构造函数new关键字在执行时会做的四件事情:
- 在内存中创建一个新的空对象
- 让this指向这个新的对象
- 执行构造函数里面的代码,给这个新对象添加属性和方法
- 返回这个新的对象(所以构造函数不需要return)
构造函数分为实例成员和静态成员 静态成员只能通过构造函数来访问
两个函数的地址不一样
构造函数原型prototype
构造函数通过原型分配的函数是所有对象共享的
javscript规定,每一个构造函数都有一个prototype属性,指向另一个对象。注意这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。
我们可以把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法。
问答?
1.原型是什么?
是一个对象,我们也称为prototype为原型对象。 每个构造函数都存在的一个对象
2.原型的作用是什么?
共享方法
_proto__
对象身上系统自己添加一个_proto_ 指向我们构造函数的原型对象 prototype
一般情况下,我们的公共属性定义到构造函数里面,公共的方法我们放到原型对象上。
因为每new一次 都会产生一个新的对象 里面包含了 方法 和属性 ,又因为方法function是复杂数据类型,会开辟新的额内存空间,。指向不一样的内存地址,浪费资源
原型对象 能共享方法,原型对象上的方法指向的地址是相同的
对象查找方法的路径 会先找new出来的对象的 身上有没有这个方法如果又 那么就调用自身的方法,如果没有回去对象身上的_proto_ 去寻找,因为_proto _指向的是构造函数的原型对象 prototype ps:构造函数身上的方法叫原型对象 (prototype) new出来的对象的原型叫 对象原型 (_proto)
constructor构造函数
如果要给原型对象添加多个方法 可以使用 对象赋值的操作
但是记得给对象中写入constructor:构造函数的名字
function Start(uname){
this.uname = uname
this.sing = function(){
console.log(this)
console.log(this.uname + '唱歌')
}
}
Start.prototype = {
constructor:Start,
sing(){
console.log(this.uname + '唱歌')
},
movie(){
console.log(this.uname + '电影')
}
}
let ldh = new Start('刘德华')
let zxy = new Start('张学友')
console.log(ldh.constructor)
ƒ Start(uname){
this.uname = uname
this.sing = function(){
console.log(this)
console.log(this.uname + '唱歌')
}
}
构造函数,原型对象,对象原型 三者的结构关系
js成员查找机制
- 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。
- 如果没有就查找他的原型(也就是–proto–原型对象)
- 如果还没有就查找原型对象的原型(Object的原型对象)
- 以此类推一直找到Object为止(null)
- –proto–对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线
利用原型的特性 可以给内置的对象添加方法
Array.prototype.arrclear = function(){
var obj = {},
newarr = []
//通过对象的特性进行数组去重
for(var i = 0;i<this.length;i++){
//判断是否存在于对象中
if(!obj[this[i]]){
obj[this[i]] = true
newarr.push(this[i])
}
}
return newarr
}
var arr2 = [1,2,3,4,5,7,7,'未付','谭','谭','7']
console.log(arr2.arrclear())