Java Script 原型链原理与继承

所有对象都有隐式原型;

原型也是对象,也有隐式原型.

function User() {}
console.log(User.prototype);

function User() {}
var u = new User();
console.log(u.hasOwnProperty);

Object.prototype.hasOwnProperty

因为Object的原型上有这个函数,所以同一条原型链上的u1也能使用它.

console.log(u.hasOwnProperty === Object.prototype.hasOwnProperty);

Object.prototype.a = 1;
function User() {}
var u = new User();
console.log(u.a);

Object.prototype.a = 1;
function User() {}
var u = new User();
var arr = [1, 2, 3];
console.log(arr.a);
因此,在Object的原型上加上任何一个成员,就会影响所有的对象.

 

var sum = new Function("a", "b", "a+b");
console.log(sum.__proto__ === Function.prototype);

自定义函数的隐式原型===function的原型.

console.log(sum.call === Function.prototype.call);
函数sum new的是Function,所有函数sum的隐式原型===Function的原型.

Function 函数,浏览器自带的,所有函数通过 new  它演化出来的.

想影响所有对象,就在Object的原型上加;想影响所有函数就在Function的原型上加.

Function.prototype.isFunc = true;
function sum() {}
console.log(sum.isFunc);

在Object原型上加东西,影响所有对象;
在函数原型上加东西,影响所有函数;
在自定义函数原型上加东西,影响所有自定义函数.

 

var arr = [2, 3, 5, 7, 89];
console.log(arr instanceof Array);
判断左边是否等于右边,输出是或否

console.log(Object.getPrototypeOf(arr1));
console.log(Object.getPrototypeOf(arr1) === Array.prototype);
得到对象的隐式原型.

var obj = {
2: 3,
b: 4,
c: 2,
};
obj.__proto__ = null;
console.log(obj);
得到一个没有隐式原型的对象;禁用

var obj = Object.create(null);
obj.a = 1;
obj.b = 5;
console.log(obj);
create 往里面传值 改变隐式原型的指向

var obj = { a: 2, b: 3 };
Object.setPrototypeOf(obj, null);

obj.__proto__ = 123;
等同于
Object.setPrototypeOf(obj, 123);
设置obj的隐式原型为null

 

继承

  1. 逻辑:A不一定是B,但B一定是A,则:B继承A、A派生B、A是B的父类、B是A的子类

  2. 子类的实例应该自动拥有父类的所有成员

  3. 单根性:子类最多只有一个父类

  4. 传递性:间接父类的成员会传递到子类中

  5. 处理构造器内部的重复;

  6. 处理原型上的重复.

标签: Javascript

添加新评论