不完全相同。
Sub.prototype = Object.create(Vue.prototype) 是将 Sub 函数的原型对象设置为一个从 Vue.prototype 对象继承而来的新对象。这意味着 Sub.prototype 对象继承了 Vue.prototype 对象的所有属性和方法,并且任何通过 new Sub() 创建的实例都将继承这些属性和方法。
而 Sub = Object.create(Vue) 是将 Sub 对象本身设置为一个从 Vue 对象继承而来的新对象。这意味着 Sub 对象继承了 Vue 对象的所有属性和方法,但是 Sub.prototype 对象仍然是一个空对象,任何通过 new Sub() 创建的实例将不会继承任何 Sub.prototype 对象中的属性和方法。
通常在创建一个自定义类时,我们会使用 Sub.prototype = Object.create(Super.prototype) 来设置子类的原型对象,以便继承父类的方法。而使用 Sub = Object.create(Super) 则更适合创建一个新的对象来扩展现有对象的功能,而不是创建一个新的类。
下面是针对cerate的验证过程 可能有些絮叨(旺柴)
function Vue() {
this.name = 'vue'
this.age = 18
this.getName = function () {
console.log(`名字${this.name}`)
}
this.getAge = function () {
console.log(`年龄${this.age}`)
}
}
Vue.prototype.getProtoName = function () {
console.log(prototype名字${this.name}
)
}
Vue.prototype.getProtoAge = function () {
console.log(prototype年龄${this.name}
)
}
function Sub() {}
// 让Sub构造函数中的prototype等于Vue.prototype
/**
- 让Sub构造函数中的prototype等于Vue.prototype
- 等同于Sub.prototype.__proto__ = Vue.prototype
- 因为之前纠结于sub.__propo__ = Sub.prototype
- 实例对象的__proto__指向构造函数的prototype 所以误认为
- sub.prototype == Sub.__proto__等式也成立
- 此段代码的意义是实现构造函数Sub所声明的所有实例对象 可以通过
- __proto__属性访问到Vue.prototype中的属性和方法
- 因为sub.__proto__ = Sub.prototype 所以sub.__proto__.__proto__ = Vue.prototype
- 隐式原型链__proto__的作用就是当一个当前对象中没有的属性或方法时
- 通过__proto__属性去当前对象的隐式原型链中查找
- sub.__proto__指向了构造函数Sub的prototype原型值
- 又因为Object.create所创建的对象的隐式原型链指向了第一个参数对象
- 等同于Sub.prototype = Object.create[这个新创建的对象拥有Vue上所有的属性和方法]
- 注:不包含构造函数中的属性和方法 如果想要继承构造函数中的属性和方法
- 需要使用call或apply方法将构造函数中的属性和方法绑定到新创建的对象上
- 例如:function Sub(name,age) {
- Vue.call(this,name,age)
- }
- 等同于sub.__proto__= Sub.prototype = Vue.prototype
- sub.__proto__.__proto__ = Sub.prototype.__proto__ = Vue.prototype
*/
Sub.prototype = Object.create(Vue.prototype, {
constructor: {
value: Sub,
},
})
const sub = new Sub()
评论 (0)