创建对象的方法
-
对象字面量
var obj2={} -
new Object()
var obj1=new Object(); -
自定义构造函数
function Star(uname,age){ this.uname=uname;//uname实例成员 this.age=age//age实例成员 this.sing=function(){//sing实例成员 alert(111) } } var ouwen=new Star('kyrie',18) console.log(ouwen) kyrie.sing();
类就是对象的模板,对象就是类的实例
构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋值,它总与new一起使用。我们可以把对象中的一些公共的属性抽取出来,封装到函数上
构造函数注意事项:
1.构造函数用于创建某一类的对象,首字母要大写
2.构造函数要和new一起使用才有意义
new在执行时会做的四件事情
1.在内存中创建一个新的对象
2.让this指向这个对象
3.执行构造函数里面的代码给新对象添加属性和方法
4.返回这个新对象(所以构造函数里面不需要return)
构造函数中的属性和方法称为成员,成员可以添加
- 实例成员就是构造函数内部通过this添加的成员
1.只能通过实例化的对象来访问
2.不可以通过构造函数来访问实例成员
- 静态成员:在构造函数上添加的成员
1.静态成员只能考构造函数来访问
2.不可以通过对象来访问实例成员
构造函数问题
浪费内存
构造函数原型prototype
构造函数通过原型匹配的函数时所有对象所共享的
js中规定,每一个构造函数都有一个prototype属性,只想另一个对象那个,注意prototype就是一个对象,这个对象所有属性和方法都会被构造函数所拥有
我们可以把那些不变的方法直接定义在prototype对象上,这样所有的对象的实例就可以共享这些方法
function Star(uname,age){
this.uname=uname;//uname实例成员
this.age=age//age实例成员
}
//一般公共的属性定义到构造函数里面
//公共的方法放在原型对象那个身上
Star.prototyoe.sing=function(){
alert(111)
}
var ouwen=new Star('kyrie',18)
console.log(ouwen)
kyrie.sing();
//对象身上系统自己添加一个_proto_指向构造函数的原型对象
//方法的查找规则:首先查看kyrie身上是否有sing方法有就执行
//有_proto_的存在就去构造函数原型对象身上查找
- 原型是一个对象prototype就是原型对象
- 共享方法
对象_proto_
对象的属性_proto_指向构造函数的原型对象
-
_proto_对象原型和原型对象是等价的
-
_proto_对象原型的以以就在于为对象的查找机制提供一个方向,后遭说一条线
-
方法的查找规则:首先查看kyrie身上是否有sing方法有就执行有_proto_的存在就去构造函数原型对象身上查找
constructor构造函数
_proto_对象原型和原型prototype里面都有一个属性constructor,constructor称为构造函数,它指向构造函数本身
如果修改了原来的原型对象,给原型对象赋值的时一个对象,必须手动 的利用constructor指回原来的函数
原型链
只要是对象就有_proto_对象原型,指向原型对象
js的成员查找机制(规则)
原型对象this指向
1.构造函数中this指向对象实例
2.原型对象中的this指向的是实例对象
原型对象的应用 扩展内置对象方法
可以通过原型对象,对原来的的内置对象进行扩展自定义的方法,比如给数组添加自定义求偶数和的功能
Array.prototype.sum = function() {
var sum = 0;
for (var i = 0; i < this.length; i++) {
sum += this[i];
}
return sum;
}
var arr = [1, 2, 3];
console.log(arr.sum());
console.log(Array.prototype);
数组和字符串内置对象不能给原型对象覆盖操作 Array.prototype={}只能是 Array.prototype.xxx = function() 的方式