在js内部,也就是js的底层,对所有数据的处理,都是以对象形式来进行的,所以,js中所有数据都有两种定义方式:
1.字面量
- var num = 10
- var str = 'abcdef'
- var bool = true
- var obj={}
- ......
2.构造函数的定义
- var arr = new Array()
- var obj = new Object()
- var num = new Number()
- var str = new String()
专门用于new来创建对象的函数,叫做构造函数
1.内置的构造函数
系统内置函数创建出来的对象
var arr =new Array()
var obj=new Number()
var str=new String()
2.自定义的构造函数
function Person(){ console.log(this) //构造函数中的this指向实例对象 } var person = new Person() //person实例对象 console.log(person)
function Person(name,age,sex){ //this指向的是实例的对象obj this.name = name; //给对象添加属性 this.age = age; this.sex = sex; } var obj = new Person("张三",12,"男") console.log(obj)
总结:
- 创建了新的对象
- 构造函数中this指向这个新的对象(new的对象)
- 执行构造函数中的代码.给对象添加属性和方法
- 返回这个新的对象
- 使用new构造函数来创建对象的过程称之为实例化
注意:
- 构造函数天生就是用来创建对象的,必须和new配合使用,否则就不具备创建对象的能力
- 构造函数内部不能有return关键字,因为构造函数会自动返回对象。如果返回基本数据类型,和不加效果一样,如果返回复杂数据类型,构造函数就没意义了。
- 如果new的时候,不需要参数,那么小括号可以省略
- 人们通常将构造函数的首字母大写
构造函数的缺点:
从一个构造函数中创建出的对象,实现的是同一种功能,他们拥有的方法应该是一样的,也就是说,同一个构造函数中new实例化得到对象,应该具备同样的方法。
通过下面的比较发现,方法是不一样的。造成了内存浪费。
function Person(name){
this.name = name;
this.say=function(){
console.log("说话");
}
}
var obj1 = new Person("张三");
var obj2 = new Person("李四");
console.log(obj1.say == obj2.say); // false 表示这是两个空间
原型
1.原型概念
任何一个对象自带一个属性:__proto__
,这个属性对应的值是一个对象,这个对象叫做对象的原型,或叫做对象的原型对象
obj._proto_
2.原型作用
原型中的属性和方法,默认就能被对象所访问
3.构造函数访问原型
任何函数天生自带属性prototype,访问到的也是原型
function fn(){}
fn.prototype
构造函数对应的原型和实例化对象的原型,是同一个对象
function Person(){
}
var obj = new Person();
console.log(obj.__proto__ === Person.prototype) // true
三者关系
构造函数,实例对象,原型对象三者之间的关系如图
面向对象代码
定义对象和给对象添加属性和方法的最好的方式
-
创建对象使用自定义构造函数
-
给对象添加属性,就在构造函数中进行
-
给对象添加方法,就利用构造函数将方法添加到原型上
function Person(name, age) {
this.name = name
this.age = age
}//给对象添加属性,就在构造函数中进行
Person.prototype.say = function(){
console.log(this.name + '会说话')
}//给对象添加方法,就利用构造函数将方法添加到原型上
var p1 = new Person('张三', 12) //创建对象使用自定义构造函数
var p2 = new Person('李四', 13)
console.log(p1.say === p2.say) // true
构造器
每一个原型对象天生带有一个属性叫做constructor
,这个属性指的是这个原型对象所对应的构造函数。
function Person(){
}
var obj1 = new Person();
console.log(obj1.__proto__.constructor )
console.log(Person);
console.log(obj1.__proto__.constructor === Person); // true
原型链
任何对象都会有原型,原型本质上是一个对象,只要是对象就会有原型。
所以,对象有原型,原型也有原型,原型的原型也有原型,。。。,这样形成一条链式结构就叫原型链。
作用
当我们访问对象上的属性和方法时,先在自己身上找,如果有,就访问到了,如果没有,顺链着原型往上找,找到了就使用,找不到就继续往上找.....,如果找到了null,都没有的话,就返回undefined;
但是给对象属性赋值和原型没关系,有就修改,没有就增加。