原型链:利用原型让一个引用类型继承另外一个引用类型的属性和方法
原型链是继承的主要方法
简单讲一下构造函数,原型和实例的关系
> 每一个函数都有一个原型对象,原型对象都包含一个指向自己的构造器指针,而实例都包含一个指向原型对象内部的指针。假如,我们让原型对象等于另一个类型的实例,结果会怎么样呢?显然,此时的原型对象将包含一个指向另一个原型对象的指针,相应的,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。
<script>
console.log(typeof x);
console.log(typeof 10);
console.log(typeof 'abc');
console.log(typeof true);
console.log(typeof null);
console.log('------我是分割线------');
console.log(typeof function(){});
console.log(typeof [1,2,3]);
console.log(typeof {a:5,b:3});
console.log(typeof new Number(10));
console.log('------我是分割线------');
function fn1() {
this.name="安子晗";
this.age=18;
}
var objFn1 = new fn1();
console.log(objFn1);
console.log(typeof fn1);
console.log('------我是分割线------');
var obj = {a: 1, b: 2};
var arr = [1,2,3];
var obj1 = new Object();
obj1.a = 1;
obj1.b = 2;
var arr1 = new Array();
arr1[0]=1;
arr1[1]=2;
arr1[2]=3;
console.log(obj);
console.log(obj1);
console.log(arr);
console.log(arr1);
console.log(obj + '---obj, ', obj1 + '---obj1');
console.log(arr + '---arr, ', arr1 + '---arr1');
console.log(typeof Object);
console.log(typeof Array);
console.log('------我是分割线------');
function superClass(name,sex,age) {
this.name= name;
this.sex= sex;
this.age=age;
}
console.log(superClass.prototype.constructor ===superClass);
console.log(Object());
superClass.prototype.print = function () {
console.log("罗怡是美女");
};
var superClassObj = new superClass("罗怡",18,"女");
superClassObj.print();
console.log(superClassObj.__proto__===superClass.prototype);
var obj2 = {};
console.log(obj2.__proto__===Object.prototype);
console.log(superClass.prototype.__proto__===Object.prototype);
console.log(Object.prototype.__proto__);
console.log('------我是分割线------');
function createFun(x,y){
return x+y;
}
console.log(createFun(2,3));
var otherCreateFun = new Function("x","y",'return x+y');
console.log(otherCreateFun(2,3));
console.log(createFun.__proto__===Function.prototype);
console.log(Function.__proto__===Function.prototype) ;
console.log(Function.prototype.__proto__===Object.prototype);
console.log(Object.__proto__===Function.prototype);
console.log(superClass.__proto__===Function.prototype);
console.log('------我是分割线------');
var arr2 = [1,2,3];
console.log(typeof arr2);
console.log(arr2 instanceof Array);
console.log(superClassObj instanceof Object);
console.log(arr2 instanceof Function);
console.log(arr2 instanceof Object);
console.log(Array.prototype.__proto__===Object.prototype);
console.log('------我是分割线------');
superClass.prototype.add = function () {
var sum = 0;
for(var i=0;i < arguments.length; i++){
sum += arguments[i];
}
return sum;
};
var superClassObj1 = new superClass();
console.log(superClassObj1.add(2,3,5));
console.log(superClassObj1);
var item;
for (item in superClassObj1) {
console.log(superClassObj1.hasOwnProperty(item));
}