RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 765445
Accepted
Алекс Кирсанов
Алекс Кирсанов
Asked:2021-01-01 03:52:13 +0000 UTC2021-01-01 03:52:13 +0000 UTC 2021-01-01 03:52:13 +0000 UTC

__proto__ 和原型有什么区别?

  • 772

这两种原型继承方式有什么区别,哪一种更好用?

function Cat() {
    this.__proto__.type = 'кот';
}


var cat = new Cat();
console.log(cat.type); // кот


function CatTwo() {
}
CatTwo.prototype.type = 'тоже кот';

var catTwo = new Cat();
console.log(catTwo.type); // тоже кот

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Grundy
    2021-01-01T04:26:05Z2021-01-01T04:26:05Z

    实际上,问题的示例中没有继承。


    __proto__直到最近才标准化。

    在最新的规范中,您会发现getter__proto__是内部函数调用的包装器[[GetPrototypeOf]]。

    与 Object.getPrototypeOf 函数完全一样


    如果应用于上述代码:

    在第一种情况下,每次创建对象时原型的值都会改变,在第二种情况下,它只设置一次。

    由此我们可以得出结论,如果可以访问构造函数,最好直接从它更改原型。


    上述代码将产生不同值的示例:

    function Cat(type) {
      this.__proto__.type = type;
    }
    
    var cat = new Cat('кот');
    console.log(cat.type); // кот
    var cat2 = new Cat('кот2');
    console.log(cat.type); // кот2
    console.log(cat2.type); // кот2
    
    
    function CatTwo() {}
    CatTwo.prototype.type = 'тоже кот';
    
    var catTwo = new CatTwo();
    console.log(catTwo.type); // тоже кот

    • 7
  2. Raz Galstyan
    2021-01-01T05:22:11Z2021-01-01T05:22:11Z

    __proto__ 属性

    绝对 JavaScript 中的任何对象都有一个proto属性。这是一个隐藏的系统属性,并非在所有语言实现中都可供用户使用。

    当访问对象的任何属性时,首先在对象本身中查找:

    var obj = {ownProperty: 1};
    console.log(obj.ownProperty);// 1
    

    但如果它不存在,则搜索发生在proto属性中:

    obj.__proto__ = {propertyOfProto: 2};
    console.log(obj.propertyOfProto);// 2
    

    如果它也不存在,则在链的下游进行搜索:

    obj.__proto__.__proto__ = {propertyOfProtosProto: 3};
    console.log(obj.propertyOfProtosProto);// 3
    

    该链称为原型链。

    在此处输入图像描述

    任何值(除了 null 和 undefined)的proto指的是其对应数据类型的原型:

    (0).__proto__ === Number.prototype
    false.__proto__ === Boolean.prototype
    "string".__proto__ === String.prototype
    (new Date).__proto__ === Date.prototype
    (function(){}/* new Function */).__proto__ === Function.prototype
    

    所有数据类型都继承自 Object,这意味着:

    Number.prototype.__proto__ === Object.prototype
    

    最后,链的末端:

    Object.prototype.__proto__ === null
    

    原型属性

    这是一个正常的属性,与任何其他属性没有什么不同。除了两件事:

    1) JavaScript 中的函数具有原型属性。默认情况下,它是一个具有单个构造函数属性的对象,该属性引用函数本身。

    在此处输入图像描述

    2) 使用 new 操作符创建新对象时使用原型属性。

    该运算符执行以下操作:

    创建一个空对象:

    var instance = {};
    

    通过对类函数原型的引用将proto设置为该对象:

    instance.__proto__ = FnClass.prototype;
    

    将类函数应用于我们新创建的对象:

    constructorReturns = FnClass.apply(instance, arguments);
    

    那些。执行 FnClass 函数,将实例作为 t​​his 传递,参数作为参数数组传递。

    返回类函数的一个实例,但是如果 FnClass 返回一个对象给我们,那么它:

    return constructorReturns instanceof Object ? constructorReturns : instance;
    

    我将类函数称为预期稍后将应用新运算符的函数。此类函数通常以大写字母命名。

    • 5

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5