实现一个symbol,需要满足以下条件:
- 返回的值不能相同
- 无法作为构造函数调用
- symbol.for 接受一个字符串作为参数,搜索是否有以该字符串作为名称的symbol值,如果有,返回该symbol值,否则返回一个新的symbol值
function symbol(str) {
if (this instanceof symbol) {
throw Error('不能做为构造函数调用')
}
return generate(str)
}
var generate = (function(){
var pos = 0
return function(str){
pos++
return str + '_' + pos
}
})()
function symbol.for = function(str){
return str
}
symbol.for('s') === symbol('s')
// false
symbol.for('s') === symbol.for('s')
// true
判断一个函数是否被当作构造函数调用
instanceof
用于检测构造函数的prototype
属性是否出现在某个实例的原型链上,当一个函数被构造函数调用时,this instanceof FuncName
为true- argumnets.callee指向函数体内当前正在执行的函数,如果
this.constructor === argumnets.callee
Object.getPrototypeOf()返回指定对象的原型。用这个方式是不能够判断一个函数是否被当作构造函数调用的。
Object.getPrototypeOf(Symbol) === Function.prototype
isPrototypeOf判断一个对象是否在另一个对象的原型链上
Function.prototype.isPrototypeOf(Symbol)
// true
再复习一遍使用new操作符调用构造函数经历的四个过程:
1. 创建一个新对象
2. 将构造函数的作用域赋给新对象,此时this指向新对象
3. 执行构造函数中的代码,为新对象添加属性
4. 返回新对象
网友评论