加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > C语言 > 正文

继承与原型链

发布时间:2020-12-15 00:46:24 所属栏目:C语言 来源:网络整理
导读:继承属性 javascript对象就是一个属性集合,包括基本属性和函数。 根据 ECMAScript 标准,someObject.[[Prototype]] 符号是用于指派 someObject 的原型。这个等同于 JavaScript 的 proto 属性(现已弃用)。从 ECMAScript 6 开始,[[Prototype]] 可以用Object

继承属性

javascript对象就是一个属性集合,包括基本属性和函数。

根据 ECMAScript 标准,someObject.[[Prototype]] 符号是用于指派 someObject 的原型。这个等同于 JavaScript 的 proto 属性(现已弃用)。从 ECMAScript 6 开始,[[Prototype]] 可以用Object.getPrototypeOf()和Object.setPrototypeOf()访问器来访问。

 {b:3,c:4} ---> null

继承方法

当继承的函数被调用时,this指向的是当前继承的对象,而不是继承的函数所在的原型对象。简单的说,就是复制了一份,this已经指向当前的对象

console.log(o.m()); // 3
// 当调用 o.m 时,'this'指向了o.

var p = Object.create(o);
// p是一个对象,p.[[Prototype]]是o.

p.a = 12; // 创建 p 的自身属性a.
console.log(p.m()); // 13
// 调用 p.m 时,'this'指向 p. 
// 又因为 p 继承 o 的 m 函数
// 此时的'this.a' 即 p.a,即 p 的自身属性 'a' 
console.log(o.m()); // 3
// console.log(o.m()); // 仍然为3,没有改变</code></pre>

创建对象和生成原型链各种方式

1.使用普通语法创建对象

    var o = {a: 1};
// o这个对象继承了Object.prototype上面的所有属性
// 所以可以这样使用 o.hasOwnProperty('a').
// hasOwnProperty 是Object.prototype的自身属性。
// Object.prototype的原型为null。
// 原型链如下:
// o ---> Object.prototype ---> null

var a = ["yo","whadup","?"];

// 数组都继承于Array.prototype 
// (indexOf,forEach等方法都是从它继承而来).
// 原型链如下:
// a ---> Array.prototype ---> Object.prototype ---> null

function f(){
                    return 2;
}

// 函数都继承于Function.prototype
// (call,bind等方法都是从它继承而来):
// f ---> Function.prototype ---> Object.prototype ---> null</code></pre>

2.使用构造器创建对象

    function Graph() {
                        this.vertexes = [];
                        this.edges = [];
    }
Graph.prototype = {
                    addVertex: function(v){
                                        this.vertexes.push(v);
                    }
};

var g = new Graph();
// g是生成的对象,他的自身属性有'vertexes'和'edges'.
// 在g被实例化时,g.[[Prototype]]指向了Graph.prototype.</code></pre>

3.使用 Object.create 创建对象

    var a = {a: 1}; 
    // a ---> Object.prototype ---> null
var b = Object.create(a);
// b ---> a ---> Object.prototype ---> null
// b.[[Prototype]] === a.prototype;
console.log(b.a); // 1 (继承而来)

var c = Object.create(b);
// c ---> b ---> a ---> Object.prototype ---> null

var d = Object.create(null);
// d ---> null
console.log(d.hasOwnProperty); // undefined,因为d没有继承Object.prototype</code></pre>

4.使用 class 关键字

    "use strict";
class Polygon {
    constructor(height,width) {
    this.height = height;
        this.width = width;
    }
}

class Square extends Polygon {
    constructor(sideLength) {
    super(sideLength,sideLength);
}
get area() {
    return this.height * this.width;
}
set sideLength(newLength) {
    this.height = newLength;
    this.width = newLength;
    }
}

var square = new Square(2);</code></pre>

备注

1.遍历对象熟悉时,原型链上的每一个属性都是可以枚举的。检查某个属性是否仅时对象的属性而不是原型链上的属性,可以使用hasOwnProperty,所有继承自 Object.proptotype 的对象都包含该属性。hasOwnProperty 是 JavaScript 中唯一一个只涉及对象自身属性而不会遍历原型链的方法。特备说明:仅仅通过判断值是否为 undefined 还不足以检测一个属性是否存在,一个属性可能存在而其值恰好为 undefined
2.如果你执行 var a1 = new A(); var a2 = new A(); 那么 a1.doSomething 事实上会指向Object.getPrototypeOf(a1).doSomething,它就是你在 A.prototype.doSomething中定义的内容。比如:Object.getPrototypeOf(a1).doSomething == Object.getPrototypeOf(a2).doSomething == A.prototype.doSomething。简而言之, prototype 是用于类型的,而 Object.getPrototypeOf() 是用于实例的(instances),两者功能一致。
3.突然明白:
当执行

    var o = new Foo();

javascript实际执行的是:

    var o = new Object();
    o.[[Prototype]] = Foo.prototype;
    Foo.call(o);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读