继承属性
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