js中与原型有关的方法有new, instanceof Object.create等
1. new
new 是调用函数的一种方式 使用new会执行如下操作
- 在内存中创建一个对象
- 新对象内部的[[prototype]]指针被赋值为构造函数的prototype属性,也是就为什么实例通过__proto__能够访问到构造函数的原型对象
- 构造函数中的this被赋值为新对象, 也就是平常说了函数的this指向new出来的对象
- 执行构造函数中的代码,给新对象添加属性和方法
- 如果构造函数没有显示返回对象,则返回这个新对象,否则返回return出来的对象
function Person() {
this.name = 'zhangsan'
// 因为this指向新创建的对象,虽然新对象并没有被返回,但是新对象依然存在
console.log(this.name); // zhangsan
return {
name: 'lisi'
}
}
let p = new Person()
// 返回了一个显示对象,所以,p不是函数执行时
// 在内存中创建的那个对象,函数内部的this不指向p
console.log(p.name); // lisi
instanceof
instanceof 是用来判断一个对象的原型中是否有某个构造函数, 所以该函数就是不断判断的找到对象的原型与构造函数对比
function myInstanceof(A, B) {
while(A) {
if(A.__proto__ === B.prototype) {
return true
}
A = A.__proto__
}
return false
}
function Person() {}
let zhangsan = new Person()
console.log(myInstanceof(zhangsan, Person)) // true
console.log(myInstanceof(zhangsan, Object)) // true
Object.create()
该函数是根据一个对象创建一个对象, 传递两个 参数,一个是关联参照对象,另一个和Object.definePropertie第二个参数相同,可以对新创建的独享进行相关的配置,简单实现create,不包括第二个参数
function myObject(obj) {
function F() {}
F.prototype = obj
return new F()
}
let obj = {}
let newObj = myObject(obj)
console.log(newObj.__proto__ == obj)
判断原型的两个方法isPrototypeOf和getPrototypeOf
function Person() {}
let zhangsan = new Person()
// isPrototypeOf 是Object.prototype上的方法 等同于__proto__
console.log(Person.prototype.isPrototypeOf(zhangsan)); // true
// getPrototypeOf是Object的方法
console.log(Object.getPrototypeOf(zhangsan) === Person.prototype); // true