所有对象都有隐式原型;
原型也是对象,也有隐式原型.
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
继承
-
逻辑:A不一定是B,但B一定是A,则:B继承A、A派生B、A是B的父类、B是A的子类
-
子类的实例应该自动拥有父类的所有成员
-
单根性:子类最多只有一个父类
-
传递性:间接父类的成员会传递到子类中
-
处理构造器内部的重复;
-
来源:原文