唯心主义蠢货的[js知识总结] new和对于argument和..arg的补充

new和对于argument和…arg的补充


new过程分析

通过console.log( new object) 我们发现 我们根据test模板,新建了一个对象,对象有对应的属性,proto中有对应的方法和构造器


过程

  • 新建一个对象
  • 将模板的所有属性赋值给这个属性
  • 改变内部的this指向
  • 返回这个对象

问题

  • js的构造函数是允许出现返回值的,当出现返回值时返回结果为对象和非对象时分别如何处理
  • obj._ proto _ = Constructor.constructor 之后为什么要 Constructor.apply(obj,arguments);

代码实现

function newObject(){
	let Constructor = [].shift.call(arguments); // 将argument的第一个值弹出
	let obj = {};
	obj.__proto__ = Constructor.prototype ;  // 规定了obj的原型 
	let result = Fn.apply(obj,args) // 运行obj的构造函数  定义 this.name = 'dog'
	return 
		result && result.toString() === "[object object]" ? result : obj;
	//判断如果构造函数有返回值 且返回值的类型为object时,则返回result,
	//如果无返回值 或者 构造函数返回值对象非object时,则返回新建的obj
}

补充:…arg 和 argument

ES6的中 …arg的使用:

1.不定参数(作为形式参数在函数内使用时)

当在function的参数中定义…arg时,说明函数可以传入不定个参数,然后arg在函数中以数组形式存在

(arg非保留字,而是一个变量)

function add( ...a ) {
	return a.reduce((m,n) => { return m + n })
}
console.log(add(1,3,6,9));
2.拓展参数(作为实际参数向函数内传入时)
    function minus( a,b,c ) {
        console.log(a*b*c);
    }
    let arr = [3,6,9];
    minus(...arr);

argument的使用

特点
  1. arguments不能显式创建
  2. arguments只有在函数中才可以使用
  3. arguments是类数组,具有下标存取的功能和length属性,其他的数组属性并没有
  4. arguments是进入函数的实际参数,所以不会和ES6的默认参数有冲突
使用:
function test(  ) {
	let args = [].slice.call(arguments,1);
	console.log(args);
}
test(()=>{ console.log('run') },1,2,3,4,6)

总结:

  1. new一个对象分两步,新建对象后将对象的__ proto __ 绑定到Constructor.prototype 上,实现对prototype的链接

  2. 然后执行构造函数,将传入的参数通过Constructor.apply进行构造

  3. 返回结果要考虑js构造函数可以有返回值的特性

  4. 对象的proto的两边是两条短线!!!!!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值