getPrototypeOf用于获取原型上的方法和属性
let fn = function () {
}
const aaa = function () {
console.log('aaaa')
}
fn.prototype.test = 111
fn.prototype.aaa = aaa
let a = new fn()
console.log(Object.getPrototypeOf(a));
setPrototypeOf用于嫁接原型上的属性和方法
let fn1 = function () {}
const abc = () => {
console.log('fn1')
}
fn1.prototype.aaa = 1
fn1.prototype.ccc = 1
fn1.prototype.abc = abc
let fn2 = function () {}
const bbc = () => {
console.log('fn2')
}
fn2.prototype.bbb = 2
fn2.prototype.ccc = 2
fn2.prototype.bbc = bbc
let a = new fn1()
let b = new fn2()
console.log(Object.getPrototypeOf(b));
console.log(Object.getPrototypeOf(a));
Object.setPrototypeOf(b, a)
console.log(Object.getPrototypeOf(b));
console.log(Object.getPrototypeOf(a));
__proto__
是每个对象都具有的一个特殊属性,它指向该对象的原型(prototype),原型是 JavaScript 中实现继承的机制之一,它允许对象通过继承共享属性和方法。具体来说,当你创建一个对象时,JavaScript 会自动为该对象添加一个 __proto__
属性,该属性指向该对象的原型。通过原型链,JavaScript 实现了对象之间的继承关系。
// 创建一个对象
const obj = {};
// obj 的原型是 Object.prototype
console.log(obj.__proto__ === Object.prototype); // 输出: true
// Object.prototype 的原型是 null
console.log(obj.__proto__.__proto__ === null); // 输出: true
// 获取 obj 的原型
console.log(Object.getPrototypeOf(obj) === Object.prototype); // 输出: true
虽然 __proto__
在 JavaScript 中是一个标准属性,但是在 ES6 标准中,它被认为是内部属性,并不推荐直接使用。相反,推荐使用 Object.getPrototypeOf()
方法来获取一个对象的原型,以及 Object.setPrototypeOf()
方法来设置一个对象的原型。
new干了啥:下面是手动实现了mynew,要用.html中的<script>
//prototype 原型
//protoType 啥也不是
function mynew(func, ...args) {
const obj = {};
obj.__proto__ = func.prototype;
let result = func.apply(obj, args);
return result instanceof Object ? result : obj;
}
function Person(name, age) {
this.name = name;
this.age = age;
//必须用this.getData,不然没有暴露,无法调用
this.getData = function () {
console.log("0000000000000");
};
}
//或者往原型上塞
Person.prototype.say = function () {
console.log(this.name);
};
let p = mynew(Person, "huihui", 123);
console.log(p); // Person {name: "huihui", age: 123}
p.say(); // huihui
p.getData(); // 00000000000000