⽇考题
⼀、什么是构造函数(10分)
- 用于构造多个对象的特殊函数
- 构造函数是函数构造器
- 构造函数:用于构造对象的模板
- 构造函数名首字母大写,便于区分普通函数
- 构造函数使用new关键词调用
⼆、简述构造函数的⼯作原理(20分)
- 使用new调用构造函数时执行了以下操作
1.创建一个对象分配给变量this
2.然后将传入的实参分配给对象的属性
3.默认返回this
三、使⽤new调⽤构造函数创建实例对象的问题是什么(10分)
- 使用同一个构造函数创建多个实例对象时,每个实例对象的方法都是私有的,同一个方法多个对象私有,消费内存
- 通过构造器函数向对象添加⽅法的缺点是:当创建多个对象实例时, 对象属性被添加到每⼀个实例对象中,也就是说内存使⽤效率降低:每个实例的属性⽅法会在内存堆中创建存储空间。
- 可以使⽤ prototype 属性解决这个问题,把⽅法添加到构造函数的 prototype 对象身上,让所有的对象实例共享⽅法。
四、我想为实例对象(构造函数:Car())添加⼀个 start(){console.log('启动')} ⽅法,请写出语句(10分)
Car.prototype.start = function(){console.log('启动')}
五、请阐述你对”对象的原型式图“的理解(50分)
- 任何构造函数内部都有 prototype 属性:该属性指向⼀个被称为 原型 的对象
- 任何 原型 对象内部都有⼀个 constructor 属性: 该属性指向构造函数 User()
- 通过关键词 new 调⽤构造函数User创建了实例对象 user1
- 在创建实例对象的过程中,构造函数⾃动为实例对象分配了⼀个⽗级对象,这个⽗级对象就是实例对象的 原型 对象。
- 任何实例对象上都有⼀个 proto 属性,该属性指向其 原型 对象。
1.什么是构造函数
- ⼀个⽤于构建多个对象的特殊函数。
- 构造函数:constructor(构造器) function(函数)
构造函数是一个构造器 - 构造函数是一个用于构造对象类型的函数
- 构造函数一个用于构造对象的模板
- 构造对象 === 创建对象
- 在JavaScript中,用new关键字来调用的函数,称为构造函数,构造函数首字母一般大写
2.创建一个User构造函数
创建一个构造函数需要两步
- 在函数体内使用this定义属性
- 使用new调用构造函数
从技术上讲,构造函数是具有以下约定的常规函数:
- 构造函数名建议⾸字⺟⼤写,以区分普通函数。
- 构造器函数应该使⽤new操作符调⽤。
请注意,ES6 引⼊了 class 关键字,允许您定义⾃定义类型。类只是构造函数的语法糖,具有⼀些增强功能。
创建一个User对象的模板函数
function User(){
this.nema = "长舟";
this.Nickname = "十恶不赦";
this.age = "10";
this.gender = "女";
this.sing = function(){console.log("晚夜微雨问海棠")};
}
使用new调用构造函数
const User1 = new User();
const User2 = new User();
console.log(User1) ;
console.log(User2) ;
传参
function User(nema,Nickname,age,gender,sing){
this.nema = nema;
this.Nickname = Nickname;
this.age = age;
this.gender = gender;
this.sing = function(){console.log("晚夜微雨问海棠")};
}
传入实参
const User1 = new User("白器","华中",18,"女");
const User2 = new User("份","华中",300,"男");
console.log(User1);
console.log(User2);
3.构造函数工作原理
基本上,使⽤new调⽤构造函数时执⾏了以下操作:
- 创建⼀个空对象并将其分配给变量this 。
- 将参数和分配给对象的属性。
- 返回 this
从技术上,构造函数在内部做隐式做了如下工作
function User(nema,Nickname,age,gender,sing){
//this 默认指向window
//this = {} 1.隐式:偷偷修改了this指向一个空对象
this.nema = nema; //2.显式:为空对象添加属性和方法
this.Nickname = Nickname;
this.age = age;
this.gender = gender;
this.sing = function(){console.log("晚夜微雨问海棠")};
}
//return this 3. 隐式:设置return this
为什么使用构造函数会创建一个对象呢?
过程复杂且不利于维护。使⽤构造器函数可以解决这个问题
构造函数里面的return
- 通常,构造函数隐式返回this,这个this指向新构建的对象。
-
如果手动返回return
return this;则同隐式返回this
return后跟⾮对象值,则返回this(⾮对象值被忽略);
return后跟对象值,则对象值覆盖this;
function User(nema, Nickname, age, gender, sing) {
//this 默认指向window
//this = {} 1.隐式:偷偷修改了this指向一个空对象
this.nema = nema; //2.显式:为空对象添加属性和方法
this.Nickname = Nickname;
this.age = age;
this.gender = gender;
this.sing = function () { console.log("晚夜微雨问海棠") };
//return this 3. 隐式:设置return this
// return "123"//如果返回非对象,那么正常返回this
return {x:1}//如果返回对象,那么返回的对象将覆盖掉this
}
const uu =new User("bzd","ai")
console.log(uu)
构造函数的问题
问题:通过构造器函数向对象添加⽅法的缺点是:当创建多个对象实例时, this.属性或方法被添加到每⼀个实例对象中,也就是说内存使⽤效率降低:每个实例的 属性或⽅法会在内存堆中创建存储空间。
解决:使用prototype:把⽅法添加到构造函数的 prototype 对象身上,让所有的对象实例共享该⽅法或者属性。
把⽅法添加到构造函数的原型对象上
示例
let student3 = new Student('⼩丽',16)
student3.sayHi() //⼩丽:'Hi~'
function User(name, age) {
this.name = name;
this.age = age
// this.sing = function () {console.log('lalala')} //错误⽅法:不要把函数添加到构造函数内
部,原因:消耗内存
}
User.prototype.sing = function () {console.log('lalala')}//正确⽅法:要把⽅法添加到构造函数的
原型对象上。
console.log(User);
const user1 = new User('张三', 19)
const user2 = new User('张三', 19)
console.log(user1.sing === user2.sing);//true 说明user1.sing和user2.sing指向同⼀个函数
// console.log(User.prototype);
// console.log(user1.toString());//[object Object]
console.log(user1.__proto__);
原型示意图
3262e8231b0cfd5957e4dfe42d46e54.png阐述
- 任何构造函数内部都有 prototype 属性:该属性指向⼀个被称为 原型 的对象
- 任何 原型 对象内部都有⼀个 constructor 属性: 该属性指向构造函数 User()
- 通过关键词 new 调⽤构造函数User创建了实例对象 user1
- 在创建实例对象的过程中,构造函数⾃动为实例对象分配了⼀个⽗级对象,这个⽗级对象就是实例对象的 原型 对象。
- 任何实例对象上都有⼀个 proto 属性,该属性指向其 原型 对象。
构造函数的prototype属性是什么
- 当使⽤new关键词调⽤构造函数创建对象实例时,构造函数会⾃动为实例对象分配⼀个⽗级对象,这个⽗级对象就是实例对象的原型。
- 并且实例对象会拥有这个它的原型的所有属性和⽅法。
- 每⼀个构造函数都有⼀个prototype属性,这个属性就是实例对象的原型对象。
- 所有的构造函数都有一个prototype属性
- prototype 属性指向⼀个对象,这个叫”原型对象“。
- 构造函数使用它指向的“原型对象”创建实例
- “原型对象”:也是一个对象,意味着原型对象也有自身的属性和方法
- “原型对象”有一个 constructor 属性
constructor
- 所有的“原型对象”身上都有一个constructor属性
- constructor属性指向一个构造函数
--proto-- 属性
- 所有的实例对象身上都有一个非标准的--proto--属性
- --proto--属性指向它的原型对象
null
- null表示到达了原型链的顶端。
网友评论