唯心主义蠢货的[js知识总结] new和对于argument和..arg的补充
程序员文章站
2022-06-15 20:25:58
...
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的使用
特点
- arguments不能显式创建
- arguments只有在函数中才可以使用
- arguments是类数组,具有下标存取的功能和length属性,其他的数组属性并没有
- arguments是进入函数的实际参数,所以不会和ES6的默认参数有冲突
使用:
function test( ) {
let args = [].slice.call(arguments,1);
console.log(args);
}
test(()=>{ console.log('run') },1,2,3,4,6)
总结:
-
new一个对象分两步,新建对象后将对象的__ proto __ 绑定到Constructor.prototype 上,实现对prototype的链接
-
然后执行构造函数,将传入的参数通过Constructor.apply进行构造
-
返回结果要考虑js构造函数可以有返回值的特性
-
对象的proto的两边是两条短线!!!!!!!!
上一篇: windows10下AirSimE2Edeeplearning训练与测试
下一篇: 还叫阿姨