标签:构造函数 改变 dir 没有 prototype null reac 原型链 之间
__proto__
和构造函数的原型prototype指向相同__proto__
原型指向的是构造函数中的prototype原型__proto__
是原型,是浏览器使用的function Student(name){ this.name = name; console.log(this); }; Student.prototype.haha = function(){ console.log("哈哈哈哈"); console.log(this); } var stu = new Student("张三"); console.log(stu); stu.haha();
js function Student(){ }; function Person(name){ this.name = name; }; Person.prototype.haha = function(){ console.log("haha"); }; Student.prototype = new Person("zhansan"); var stu = new Student(); stu.haha(); console.dir(Student); console.dir(stu);
Object.prototype.__proto__=null
。代码:
``` js
function Person(){
};
var per = new Person();
console.log(Person.prototype == per.__proto__);
console.log(Person.prototype.__proto__ == Object.prototype);
console.log(Object.prototype.__proto__);
```
结果:
分析图:
js // 父类--动物 function Animal(color){ this.color = color; } Animal.prototype.eat = function(){ console.log("吃东西"); }; // 子类--狗 function Dog(weight){ this.weight = weight; } Dog.prototype = new Animal("yellow"); Dog.prototype.bite = function(){ console.log("咬拖鞋"); }; // 子类的子类--金毛 function JinMao(age){ this.age = age; } JinMao.prototype = new Dog("20kg"); JinMao.prototype.clever = function(){ console.log("机智"); } console.dir(new Animal("grey")); console.dir(new Dog("30kg")); console.dir(new JinMao("5岁")); var jinMao = new JinMao("6岁"); jinMao.eat(); jinMao.bite(); jinMao.clever();
父类.call(this,p1,p2...);
js // 父类 function Person(name,age){ this.name = name; this.age = age; } Person.prototype.haha = function(){ console.log("haha"); } // 子类 function Student(name,age,score){ Person.call(this,name,age,score); this.score = score; } var stu = new Student("张三",18,99); console.dir(stu); stu.haha();
js function Person(name,age){ this.name = name; this.age = age; }; Person.prototype.haha = function(){ console.log("hahahah"); }; function Student(name,age,score){ // 借用父级构造函数继承父类属性 Person.call(this,name,age,score); this.score = score; } // 改变原型指向(指向不含属性的父类对象),仅继承父类的原型方法 Student.prototype = new Person(); Student.prototype.study = function(){ console.log("学习学习"); }; var student = new Student("小明",18,90); console.dir(student); student.haha(); student.study();
拷贝继承:遍历拷贝每个属性
代码:
``` js
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.haha = function(){
console.log("haha");
}
一个继承逆推的例子:
js // 函数的声明 function f1(){ console.log(111); } // 函数表达式 var f2 = function(){ console.log(222); } f1(); f2();
js // 不同函数的调用方式 function f1(){ console.log("1111"); } f1();// 普通函数:直接调用 function Person(){ console.log("this is a constructor"); } var per = new Person();//构造函数:通过‘new’关键字调用 function Game(){ this.play = function(){ console.log("play~"); } } new Game().play();// 对象方法:通过[对象.方法]的形式调用;
function f1(){};
console.dir(f1);
console.log(f1.__proto__ == Function.prototype);
结果:数组中函数的调用
代码:
js var arr = [ function(){ console.log(11); }, function(){ console.log(22); }, function(){ console.log(33); }, function(){ console.log(44); } ]; // 回调函数:将函数作为参数传入 arr.forEach(function(ele){ ele(); });
结果:
报错:xxx is not defined与undefined
代码:
``` js
function Person(){
结果: ![image text](https://github.com/zephyrlai/my-font-end-note/raw/master/05.%20js进阶使用/03.%20day03/images/零散0101.png) 引申: 1. Object.prototype中没有__proto__属性,所以
Object.prototype.__proto__=null1. 代码:
js标签:构造函数 改变 dir 没有 prototype null reac 原型链 之间
原文地址:https://www.cnblogs.com/laizonghao/p/10393260.html