Object.setPrototypeOf と Object.create() の違い

Objectそれについて話す前に、オブジェクトを作成するいくつかの方法と、new Object()Object.createの違いを確認しましょう。

①:リテラルを使用してオブジェクトを作成する

let person = {
    
    
  name: 'nick'
}

②: コンストラクタ形式のオブジェクトの作成

let person = new Object({
    
     name: 'nick' })

③:Objecr.createオブジェクトの作成

let person = Object.create(Object.prototype, {
    
     
	name: 'nick',
    enumerable: true, // 可枚举
    configurable: true, // 可通过Object.definePrototype修改其配置 
    writable: true // 可重写
})

1 番目のタイプと 2 番目のタイプには本質的な違いはなく、単に書き方を簡略化したものであり、2 番目と 3 番目のタイプの違いについて説明します。

new Object()Objectコンストラクターのプロトタイプはprocess に継承されます。newプロセス内で何が起こるかを確認できます。

function MyNew(fun) {
    
    
	// 创建一个对象
	let obj = {
    
    }
	// 获取参数,这里要给参数arguments绑定Array原型上的方法,并且排除第一个参数fun
	let args = Array.prototype.slice.call(arguments, 1)
	// 执行函数,绑定this,这里用call也一样,只不过参数类型不一样
	let res = fun.apply(obj, args)
	// 绑定原型,这里也可以用Object.setPrototypeOf()来绑定,也可以使用 Reflect.setPrototypeOf() 来绑定
	obj.__proto__ = fun.prototype
	// Object.setPrototypeOf(obj, fun.prototype)
	// Reflect.setPrototypeOf(obj, fun.prototype)
	// 判断是否返回对象,反之返回生成的对象
	return Object.prototype.toString.call(res) === '[object Object]' ? res : obj
}

上で、プロトタイプが継承されていることがわかりますObjectObject.create最初のパラメーターは、プロトタイプを設定するためのものです。2 番目のパラメーターは、独自のプロパティとメソッドをバインドし、そのプロパティ記述子を設定できます。次に、 と の違いを検討しObjecr.createますObject.setProrotypeOf

注: これらはすべて、ES5によって提案された新しい方法です。

function Student() {
    
    
  this.name = '小明'
}

Student.prototype.getName = function () {
    
    
  return this.name
}

function Person() {
    
    
  this.age = 18
}

Person.prototype.getAge = function () {
    
    
  return this.age
}

Student.prototype = Object.create(Person.prototype)

console.log(Student.prototype)

Student結果を出力すると、元のプロトタイプとコンストラクターがすべて置き換えられたことがわかります。

ここに画像の説明を挿入します
もう一度試してみましょObject.setPrototypeOf

Object.setPrototypeOf(Student.prototype, Person.prototype)

console.log(Student.prototype)

印刷するとわかるように、現在のプロトタイプ オブジェクトは保持され、現在のプロトタイプ オブジェクトに基づいて新しいプロトタイプ オブジェクトが追加されます。prototype

ここに画像の説明を挿入します
拡大する:

  • 1. オブジェクトのプロトタイプを取得します。xx.getPrototypeOf()
  • 2. オブジェクトのプロパティ記述子を取得します。Object.getOwnPropertyDescriptor(xx, 'xx')

おすすめ

転載: blog.csdn.net/Vue2018/article/details/129990978