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
}
上で、プロトタイプが継承されていることがわかりますObject
。Object.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')