V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
luoway
V2EX  ›  JavaScript

关于什么是 prototype、原型、继承,我这种简单到两三句话的理解有没有错误?

  •  
  •   luoway · 2015-10-15 10:12:57 +08:00 · 2338 次点击
    这是一个创建于 3355 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/luoway/luoway.github.io/blob/master/_posts/2015-10-14-prototype-inherit-Object.md

    prototype 只是一个纯粹的习惯性的属性名

    原型是 JavaScript 一种对象引用的方法,不同于把 A 赋给 B ,两个变量引用一个对象。而是,
    给 B 添加一个通常命名为“ prototype ”的属性,它是一个对象(它往往被 new 实例化的过程中声明为对象),用这个属性来引用 A

    继承是指, B.prototype 引用了 A ,所以说 B (其实是 B 的 prototype 属性)继承了 A (构造)的属性。

    区分
    原型:声明一个属性 prototype ,引用一个对象。该属性引用的对象,是该属性所属对象的原型;
    继承:通过执行 new ConstructFunc()、 Object.create(obj)继承。

    《 JavaScript 权威指南》的不解释,让原型“看起来很难的样子”,理解了发现其实就是个引用对象。


    这样理解没错吧?我用代码试的时候没错,担心漏了什么……

    10 条回复    2015-10-16 13:32:13 +08:00
    hbkdsm
        1
    hbkdsm  
       2015-10-15 10:43:38 +08:00   ❤️ 1
    感觉楼主还没分清 prototype, __proto__ 和 [[Prototype]],还需努力。
    luoway
        2
    luoway  
    OP
       2015-10-15 11:34:01 +08:00
    @hbkdsm 感谢指出

    详细了解__proto__让我发现了我理解上的很多疏漏

    继续努力

    [[Prototype]]是什么搜索不到,能否再指点一下?
    mcfog
        3
    mcfog  
       2015-10-15 11:45:19 +08:00
    @luoway 去看 ECMAScript 标准吧,虽然有点枯燥拗口,但能啃下来以后这块就毫无问题了,有疑问也只要翻翻标准条文就能解释
    hbkdsm
        4
    hbkdsm  
       2015-10-15 11:52:10 +08:00
    @luoway http://lzw.me/pages/ecmascript/#79
    对象的 [[Prototype]] 是一个内部属性,用于引用该对象的原型对象
    luoway
        5
    luoway  
    OP
       2015-10-15 12:01:31 +08:00
    @mcfog 现在我在试图总结和解释,虽然手上只有《 JavaScript 权威指南》,里面也解释不连贯。

    @hbkdsm 谢谢,我好好看看,再来修改和完善自己的解释。
    luoway
        6
    luoway  
    OP
       2015-10-15 18:57:59 +08:00
    @hbkdsm 更新了


    原型:
    所有对象都有一个叫做 [[Prototype]] 的内部属性,它用于实现继承。
    自有对象( Object 、 Array 、 Function )有原生属性 prototype 暴露内部属性[[Prototype]], prototype 指向被继承的原型。
    __proto__属性指向该对象继承的原型,可以改变__proto__以改变指向哪个原型。

    继承:
    三种方法实现继承。
    new Constructor()、使对象__proto__属性指向被继承原型、 Object.create(obj [, properties])。
    tftk
        7
    tftk  
       2015-10-16 12:46:10 +08:00
    __proto__ 就是 [[Prototype]],根据引擎实现不同。

    自有对象( Object 、 Array 、 Function )有原生属性 prototype 暴露内部属性[[Prototype]], prototype 指向被继承的原型。

    对象默认继承自 Object 的原型。
    luoway
        8
    luoway  
    OP
       2015-10-16 12:58:22 +08:00
    @tftk 感谢提出
    > __proto__ 就是 [[Prototype]],根据引擎实现不同。
    prototype 也是[[Prototype]]

    能说说两者的不同吗?
    tftk
        9
    tftk  
       2015-10-16 13:20:01 +08:00
    @luoway
    __proto__ 是指向继承自的对象的原型,是和对象的原型的关系。

    prototype 是当前对象的属性,在创建对象的时候自动获得的,指向当前对象的原型对象。
    luoway
        10
    luoway  
    OP
       2015-10-16 13:32:13 +08:00
    @tftk
    > __proto__ 是指向 继承自的 对象的 原型
    所以指向原型的原型?

    对象属性、自定义的对象没有 prototype ,
    var A = {
    say: "This is A"
    }, B = {};
    function F(){}
    console.log(B.prototype); //undefined
    console.log(F.prototype); //{constructor: function F()}
    console.log(B.__proto__); //Object
    console.log(B.__proto__.prototype); //undefined

    [[Prototype]]是在创建对象的时候自动获得的,但 prototype 不是。

    看这个:
    console.log(Object.__proto__);//function()
    console.log(Object.prototype);//Object

    自有对象的 prototype 能正确地指向原型,非自有对象的__proto__也能正确地指向原型。
    自有对象的__proto__不正确指向,非自有对象的 prototype 不存在。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2856 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:04 · PVG 16:04 · LAX 00:04 · JFK 03:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.