getPrototypeOf,setPrototypeOf,prototype,__proto__,New

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天吃饭的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值