javascript构造函数

在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)

 

 总结:

  1. 创建了新的对象
  2. 构造函数中this指向这个新的对象(new的对象)
  3. 执行构造函数中的代码.给对象添加属性和方法
  4. 返回这个新的对象
  5. 使用new构造函数来创建对象的过程称之为实例化

注意:

  1. 构造函数天生就是用来创建对象的,必须和new配合使用,否则就不具备创建对象的能力
  2. 构造函数内部不能有return关键字,因为构造函数会自动返回对象。如果返回基本数据类型,和不加效果一样,如果返回复杂数据类型,构造函数就没意义了。
  3. 如果new的时候,不需要参数,那么小括号可以省略
  4. 人们通常将构造函数的首字母大写

 构造函数的缺点:

从一个构造函数中创建出的对象,实现的是同一种功能,他们拥有的方法应该是一样的,也就是说,同一个构造函数中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;

但是给对象属性赋值和原型没关系,有就修改,没有就增加。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值