继承与原型链

前端之家收集整理的这篇文章主要介绍了继承与原型链前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

继承属性

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
// 当<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a> o.m 时,'this'指向了o.

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

p.a = 12; // 创建 p 的自身<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>a.
console.log(p.m()); // 13
// <a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a> p.m 时,'this'指向 p. 
// 又因为 p 继承 o 的 m <a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>
// 此时的'this.a' 即 p.a,即 p 的自身<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a> 'a' 
console.log(o.m()); // 3
// console.log(o.m()); // 仍然为3,没有改变</code></pre>

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

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

    var o = {a: 1};
// o这个对象继承了Object.prototype上面的所有<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>
// 所以可以这样使用 o.hasOwnProperty('a').
// hasOwnProperty 是Object.prototype的自身<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>。
// Object.prototype的原型为null。
// 原型链如下:
// o ---> Object.prototype ---> null

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

// 数组都继承于Array.prototype 
// (indexOf,forEach等<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>都是从它继承而来).
// 原型链如下:
// a ---> Array.prototype ---> Object.prototype ---> null

function f(){
                    return 2;
}

// <a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>都继承于Function.prototype
// (call,bind等<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>都是从它继承而来):
// 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是<a href="https://www.jb51.cc/tag/shengcheng/" target="_blank" class="keywords">生成</a>的对象,他的自身<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>有'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);
原文链接:https://www.f2er.com/note/422471.html

猜你在找的程序笔记相关文章