这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
####构造函数执行 new
构造函数执行就是创建自定义类和类所对应的实例的
- 像普通函数执行一样,把函数执行,并且私有上下文和形参赋值等都操作一遍
- 在形成私有上下文之后,首先默认会创建一个对象(实例对象)
- 让当前上下文中的this 指向创建的这个对象
- 接下来代码执行过程中所有的this.xxx = xxx 都是给实例对象设置私有的属性和方法
- 代码执行完成后,看是否有返回值,没有返回值迷人返回创建的实例对象,如果有返回值,如果返回基本类型值,那么返回的还是实例对象,如果返回的是引用类型值,以自己返回的为主
- 因为构造函数执行既有普通函数执行的一面,也有特殊的一面,所以在所属私有上下文中,只有this.xxx = xxx才跟实例有关系
var f1 = new Func(); var f2 = new Func;
区别
-
不写括号传不了实参
-
运算优先级问题 Func()优先级是19,Func优先级18
-
new Func().say() 先创建实例,再去调用.say() 执行
-
new Func.say() 先成员访问获取到Func.say()的值,最后再把获取的值new一下
检测当前实例是否属于这个类
f1 instancsof Func 检测某个对象是否具备这个属性 in ,是否为私有属性 hasOwnProperty
console.log('say' in f1); console.log(f1.hasOwnProperty('say'));
Object.create(xxx);创建一个空对象,并且把xxx 作为创建对象的原型(空对象. proto ),XXX 必须是对象或者null,如果xxx 是null,则创建一个没有任何原型指向的空对象
Func 创造一个类的实例
剩余的参数都是给Func 这个函数传递的实参以数组形势存在args里面
function _new (Func,...args){
let obj = {}
obj.__proto__ = Func.prototype // IE 中不能使用__proto__
// Object.create(xxx) 创建一个空对象,并且会把xxx作为当前对象的原型链指向
let obj = Object.create(Func.prototype); //不兼容低版本浏览器
let result = Func.call(obj,...args);
if(result == null || !/^(object|function)$/.test(typeof result)) return obj;
return result
}
重写Object.create
重写Object.create 创建某个类的空实例
Object.create = function create(prototype){
function Func(){}
Func.prototype = prototype;
return new Func();
}