本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于new的相关问题,new运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一,希望对大家有帮助 。
文章插图
【相关推荐:javascript视频教程】
前言什么是
new
呢? 光看定义还是有几分晦涩,直接看一个具体的例子,来了解一下new
运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一 。
JavaScript
中的new
实现的功能 。 举个例子// 现实中瘦不了,但网络中一定要保持苗条function Thin_User(name, age) { this.name = name; this.age = age;}Thin_User.prototype.eatToMuch = function () { // 白日做梦吧,留下肥胖的泪水 console.log('i eat so much, but i\'m very thin!!!');}Thin_User.prototype.isThin = true;const xiaobao = new Thin_User('zcxiaobao', 18);console.log(xiaobao.name); // zcxiaobaoconsole.log(xiaobao.age); // 18console.log(xiaobao.isThin); // true// i eat so much, but i'm very thin!!!xiaobao.eatToMuch();通过上面这个例子,我们可以发现
xiaobao
可以: - 访问到构造函数
Thin_User
中属性访问到Thin_User.prototype
中属性new
做了这些事: - 创建了一个空对象,对象的
__proto__->Thin_User.prototype
执行构造函数,并将this
指向新对象返回新对象new
是关键字,我们无法像模拟数组高阶方法一样覆盖,因此我们写一个函数createObject
,来模拟new
的效果 。 使用具体如下: function Thin_User(name, age) {}const u1 = new Thin_user(...)const u2 = createObject(Thin_User, ...a\)初步模拟根据上面分析,
createObject
编写的大致步骤为: - 创建一个新对象
obj
设置obj.__proto__->constructor.prototype
(但JavaScript不推荐直接修改__proto__属性,提供了setPrototypeOf方法来专门修改原型)使用constructor.call/apply(obj, ...)
,将属性添加到obj
上返回obj
学习完这些,我们就可以编写第一版代码:__proto__和prototype
,可以看JavaScript之彻底理解原型与原型链
call/apply
,可以看JavaScript之手撕call、apply
function createObject(Con) { // 创建新对象obj // var obj = {};也可以 var obj = Object.create(null); // 将obj.__proto__ -> 构造函数原型 // (不推荐)obj.__proto__ = Con.prototype Object.setPrototypeOf(obj, Con.prototype); // 执行构造函数 Con.apply(obj, [].slice.call(arguments, 1)); // 返回新对象 return obj;}返回值效果众所周知,函数是有返回值的,那构造函数如果有返回值,最终执行
new
后返回的结果是怎样的那? 返回值为基本类型假设构造函数返回值为一个基本类型,我们来看一下最后的返回结果:
function Thin_User(name, age) { this.name = name; this.age = age; return 'i will keep thin forever';}Thin_User.prototype.eatToMuch = function () { console.log('i eat so much, but i\'m very thin!!!');}Thin_User.prototype.isThin = true;const xiaobao = new Thin_User('zcxiaobao', 18);console.log(xiaobao.name); // zcxiaobaoconsole.log(xiaobao.age); // 18console.log(xiaobao.isThin); // true// i eat so much, but i'm very thin!!!xiaobao.eatToMuch();最后的返回结果好像受到任何干扰,难道构造函数不会对返回值进行处理吗?
不急,我们来接着测试一下返回值为对象的情况 。
返回值为对象【JavaScript把new给拿捏住了】function Thin_User(name, age) { this.name = name; this.age = age; return { name: name, age: age * 10, fat: true }}Thin_User.prototype.eatToMuch = function () { // 白日做梦吧,留下肥胖的泪水 console.log('i eat so much, but i\'m very thin!!!');}Thin_User.prototype.isThin = true;const xiaobao = new Thin_User('zcxiaobao', 18);// Error: xiaobao.eatToMuch is not a functionxiaobao.eatToMuch();当我执行
eatToMuch
时,控制台直接报错,没有当前函数,于是我打印了xiaobao
对象:文章插图
发现
xiaobao
对象的age
发生了改变,而且增加了fat
属性,正好与构造函数的返回值一样 。 看完这两个例子,基本可以理清构造函数有返回值的情况:当构造函数返回值为对象时,直接返回这个对象 。
推荐阅读
- 香蕉皮的6大妙用,可惜很多人都把它扔了!
- 头发爱出油都是洗头惹的祸 把握洗头次数健康洗头
- 分手后归还礼物的心理 分手后把礼物还给对方
- 撩妹用的幽默情话短句?顺手把妹子搂到怀里
- 探探超强聊天套路,手把手教你探探怎么聊!
- 每天走路对身体的好处 把这些缠人的疾病都走掉
- 教育孩子重在示范,不是纠错!
- 这样把打赏的礼物提现的方法 打赏的礼物可以换钱吗
- 花店把剪刀放在礼物里 跟花店有关的小礼物
- 把女朋友送的礼物丢了的应对方法 女朋友背部皮肤不好送什么