//原型链
// 原型链
// 对象的__proto__它的是原型,而原型也是一个对象,也有__proto__属性,原型的__proto__又是原型的原型,就这样可以一直通过__proto__想上找,这就是原型链,当向上找找到Object的原型的时候,这条原型链就算到头了
var M=function(name){this.name=name;}; //prototype也是指向原型对象
//原型对象的construor指向的也是构造函数
var o3=new M("o3"); //实例_protpo_指向原型对象
// console.log(o3);
//o3.__proto__===M.prototype //true 对象和函数指向相同
//M.prototype.constructor===M //true 原型对象的construor指向构造函数
var o5=new M();
o3.__proto__.say=function(){ //实例的原型上添加一个方法,这个原型的所有实例就都有了这个方法
console.log("hello world")
}
// o3.say(); //hello world
// o5.say(); //hello world
// instanceof用于判断实例对象的_protp_和生成该实例的构造函数的prototype是不是同一个地址
//o3 instanceof M //true
//o3 instanceof Object //true
//判断实例是由那个构造函数生成的
//o3.__proto__.constructor===M; //true
//o3.__proto__.constructor===Object; //true
//继承
//js继承
//如果需要继承 那么就需要一个父类
function Animal(name){
this.sleep=function(){
console.log(this.name+"正在睡觉");
}
}
//构造继承
Animal.prototype.eat=function(food){ //等同于上面的sleep
console.log(this.name+"正在吃"+food);
}
// 构造继承 复制父类的实例属性给子类(没用到原型)
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
var cat = new Cat();
console.log(cat.name); //tom
//console.log(cat.eat("fish")); //报错 因为没有在父元素中
console.log(cat.sleep()); //tom正在睡觉
//组合继承调用父类构造,集成父类元素并且保留参数,将父类实例作为子类原型,实现函数复用
function Pig(name) {
Animal.call(this);
this.name = name || "pig";
}
Pig.prototype = new Animal(); //获取父类继承
//Test Code
var pig = new Pig();
console.log(pig.name);
console.log(pig.sleep());
//寄生组合继承 不会初始化两次实例
function Dog(name){
Animal.call(this);
this.name=name || "dog";
}
(function(){
var Super =function(){};
Super.prototype = Animal.prototype;
Dog.prototype = new Super();
})();
var dog=new Dog();
console.log(dog.name);
console.log(dog.sleep());
//oop
// oop 思想 还是不咋的 学typescript再深入点吧
var Person = function () {
this.head="one",
this.hand="two",
this.foot-"two",
this.run = function () {
console.log("runing");
}
}
var joan=new Person();
joan.run();
console.log(joan.__proto__===Person.prototype); //true
var Niki = new Person();
Person.prototype.run=function(){ //与 this.run 相同
console.log("runing");
}
joan.run(); //runing
Niki.run(); //runing