欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-15 20:25:58
...

new和对于argument和…arg的补充


new过程分析

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

通过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的两边是两条短线!!!!!!!!