我们说过所有的对象都有原型,而原型也是对象,也就是说原型也有原型,那么如此下去,也就组成了我们的原型链。 属性搜索原则属性搜索原则,也就是属性的查找顺序,在访问对象的成员的时候,会遵循以下原则: - 首先从对象实例本身开始找,如果找到了这个属性或者方法,则返回。
- 如果对象实例本身没有找到,就从它的原型中去找,如果找到了,则返回。
- 如果对象实例的原型中也没找到,则从它的原型的原型中去找,如果找到了,则返回。
- 一直按着原型链查找下去,找到就返回,如果在原型链的末端还没有找到的话,那么如果查找的是属性则返回 undefined,如果查找的是方法则返回 xxx is not a function。
更简单的原型语法在前面的例子中,我们是使用 xxx.prototype. 然后加上属性名或者方法名来写原型,但是每添加一个属性或者方法就写一次显得有点麻烦,因此我们可以用一个包含所有属性和方法的对象字面量来重写整个原型对象: - function Student(name, age, gender) {
- this.name = name;
- this.age = age;
- this.gender = gender;
- }
- Student.prototype = {
- hobby:"study",
- sayHi:function(){
- console.log("hi");
- }
- }
- var s1 = new Student("wangwu",18,"male");
- console.log(Student.prototype.constructor === Student);//结果为 false
复制代码但是这样写也有一个问题,那就是原型对象丢失了 constructor 成员。所以为了保持 constructor 成员的指向正确,建议的写法是: - function Student(name, age, gender) {
- this.name = name;
- this.age = age;
- this.gender = gender;
- }
- Student.prototype = {
- constructor: Student, //手动将 constructor 指向正确的构造函数
- hobby:"study",
- sayHi:function(){
- console.log("hi");
- }
- }
- var s1 = new Student("wangwu",18,"male");
- console.log(Student.prototype.constructor === Student);//结果为 true
复制代码 原型链继承我们都听过这么一句话:子承父业。而在我们的 JavaScript 中也有继承。接下来我们会学习原型链继承。原型链继承的主要思想是利用原型让一个引用类型继承另外一个引用类型的属性和方法。 - function Student(name, age, gender) {
- this.name = name;
- this.age = age;
- this.gender = gender;
- }
- Student.prototype.sayHi = function(){
- console.log("hi");
- }
- var s1 = new Student("zhangsan",18,"male");
- s1.sayHi(); //打印 hi
- var s2 = new Student("lisi",18,"male");
- s2.sayHi(); //打印 hi
复制代码上述例子中实例化对象 s1 和 s2 都继承了 sayHi 方法。 Object.prototype 成员介绍在控制台中输入以下代码: 我们介绍常用的几个 Object.prototype 成员:
|