js中有关原型的几种方法

138 阅读2分钟

js中与原型有关的方法有new, instanceof Object.create等

1. new

new 是调用函数的一种方式 使用new会执行如下操作

  1. 在内存中创建一个对象
  2. 新对象内部的[[prototype]]指针被赋值为构造函数的prototype属性,也是就为什么实例通过__proto__能够访问到构造函数的原型对象
  3. 构造函数中的this被赋值为新对象, 也就是平常说了函数的this指向new出来的对象
  4. 执行构造函数中的代码,给新对象添加属性和方法
  5. 如果构造函数没有显示返回对象,则返回这个新对象,否则返回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