什么是构造函数
在JavaScript中,用new关键字来调用的函数,称为构造函数,构造函数首字母一般大写
使用构造函数的场景
var p1 = { name:'Tom',age:'18',sex:'男'}; var p2 = { name:'Jerry',age:'18',sex:'男'}; var p3 = { name:'Speike',age:'20',sex:'男'}; var p4 = { name:'Tyke',age:'8',sex:'男'};、 var p... = {...}
如果有很多对象,那么重复很多次,出现代码冗余
当做构造函数的参数传入,我们可以由此创建出如下函数
function Person(name, age, sex) { this.name = name; this.age= age; this.sex= sex; }
我们可以通过new关键字,也就是通过构造函数来创建对象了
var p1 = new Person('Tom', '18', '男'); var p2 = new Person('Jerry', '18', '男');
此时,我们发现,创建对象,会很方便,在此场景下,产生很多重复代码,而使用构造函数就可以实现代码的复用。
构造函数执行过程
function Animal(color) { this.color = color; }
此时的Animal
函数还不算一个构造函数,当它有一个new关键字来调用时,我们才能说它是一个构造函数。如下面这样
var dog = new Animal("black");
执行过程:
function Person(name, age, sex) { this.name = name; this.age= age; this.sex= sex; } var p1 = new Person('Tom','男','18');
此时,Person构造函数会有一下几个执行过程。
1、当以new关键字调用,会创建出一个新的工作空间,标记为Person的实例 ,内存分配
2、将空对象的原型绑定为new操作符后面的构造函数的原型
3、函数体内部的 this 指向该内存,并执行构造函数的函数体,创建相关属性和方法
4、判断执行结果是否返回了新的对象,如果有返回新对象,就是用返回的新对象,没有的话,返回原来创建的对象(obj)
5、constructor:这是实例对象都自动含有的属性,指向他们的构造函数
缺点:每个函数都会开辟一块新的内存,造成内存浪费
解决方法:原型
console.log(car.constructor === Car)//true
car.__proto__ === Card.prototype // true
每定义一个函数,这个函数就带有一个prototype的属性,__proto__
指向被实例化的构造函数的prototype,
prototype默认带有constructor属性,constructor指向构造函数。
构造函数的问题
构造函数方法虽然好用,但是存在浪费内存的问题。对于每一个实例对象,tyre都是一样的内容,每一次生成一个实例,都必须 生成重复的内容,多占用内存。既不环保也缺乏效率
function Car(brand, color) { this.brand = brand this.color = color this.tyre = function () { console.log('我有三个轮子') } } var c1 = new Car('三蹦子', '蓝色') var c2 = new Car('电动三轮', '白色') console.log(c1.tyre === c2.tyre)//false
prototype原型
js中,每一个构造函数都又有一个prototype
属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。实例化的__proto__
指向构造函数的原型对象。
function Car(brand, color) { this.brand = brand this.color = color } Car.prototype.tyre = function () { console.log('我有三个轮子') } var c1 = new Car('三蹦子', '蓝色') var c2 = new Car('电动三轮', '白色') console.log(c1.tyre === c2.tyre)//true console.log(c1.__proto__ === Car.prototype)//true
总结:
- 构造函数有一个原型对象,通过pototype获取
- 构造函数创建 实例对象后,每个对象都有一个私有的
__proto__
属性,指向构造函数的原型对象
对象与构造函数的关系
对象是由构造函数造出来的
-
Object是Function 的一个实例。
Object.constructor == Function //true
2、函数是Function 的实例,但不是Object 的实例。
function fn(){} fn.constructor == Function //true fn.constructor == Object //false
3、{} 与 Object 的关系
var obj = {}; obj.constructor === Object //true
用instanceof 可以检查一个对象是否是一个类的实例,是则返回true;
标签:name,age,JS,var,new,sex,构造函数 From: https://www.cnblogs.com/mc-congxueda/p/16712256.html