console.log(person.name) // Kevin
console.log(person.habit) // Games
console.log(person.strength) // undefined
console.log(person.age) // undefined
```javascript
// 注意:当new的构造函数有返回内容且内容为一个对象时。实例只会继承返回对象的属性。下面做了判断。
function create() {
let obj = {};
let con = [].shift.call(arguments);
obj.__proto__ = con.prototype;
let result = con.apply(obj, arguments);
return result instanceof Object ? result : obj;
}
instanceof
function myInstanceof (left, right) {
const prototype = right.prototype
let left = left.__proto__
while(true){
if(left===undefined || left===null){
return false
}
if(left === prototype){
return true
}
left = left.__proto__
}
}
call的实现
apply
bind()函数会创建一个新的绑定函数(bound function,BF)。绑定函数是一个 exotic function object(怪异函数对象,ECMAScript 2015 中的术语),它包装了原函数对象。调用绑定函数通常会导致执行包装函数。绑定函数具有以下内部属性:
当调用绑定函数时,它调用[[BoundTargetFunction]]上的内部方法[[Call]],就像这样Call(boundThis,args)。其中,boundThis是[[BoundThis]],args是[[BoundArguments]]加上通过函数调用传入的参数列表。 绑定函数也可以使用new运算符构造,它会表现为目标函数已经被构建完毕了似的。提供的this值会被忽略,但前置参数仍会提供给模拟函数。
一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数
new
var person = new Otaku('Kevin', '18');
console.log(person.name) // Kevin console.log(person.habit) // Games console.log(person.strength) // undefined console.log(person.age) // undefined
instanceof