对象
创建对象的方式
Object.create()
- 通过
Object.create() 创建出来的对象其 原型链指向了引用的类型
const obj = {}
const bar = Object.create(obj)
bar.__proto__ === obj
const obj = {} 字面量方式创建
const obj = {}
obj.__proto__ === Object.prototype
new 方式创建
function Person(name) {
this.name = name
}
Person.prototype.getName = function(){
console.log(this.name)
}
const p = new Person('张三')
p.getName()
console.log(p.__proto__ === Person.prototype)
console.log(Person.prototype.constructor === Person)
console.log(p.__proto__.constructor === Person)
new 的执行过程
- 创建了一个空对象
- 将空对象的原型链指向函数的原型
- 指向函数并将this指向改为对象
- 返回
4.1 如果当前函数有返回值且返回值为对象则正常返回
4.2 如果当前函数有返回值且返回值不是对象则返回当前对象
4.3 如果当前函数无返回值则返回当前对象
function Person(name) {
this.name = name
}
Person.prototype.getName = function(){
console.log(this.name)
}
function newObj(fn) {
if(typeof fn !== 'function'){
console.log('the first param is not a function')
return
}
let obj = {}
obj.__proto__ = fn.prototype
const res = fn.apply(obj, Array.prototype.slice.call(arguments, 1))
return typeof res === 'object' && res !== null ? res : obj
}
const obj = newObj(Person, '张三')
console.log(obj.__proto__ === Person.prototype)
console.log(Person.prototype.constructor === Person)
console.log(obj.__proto__.constructor === Person)
继承