js原型继承 调用原型同名方法
在JavaScript中,原型继承是一种通过对象的原型链来实现继承的方法。通过原型链,一个对象可以继承另一个对象的属性和方法。在原型继承中,当一个对象需要调用原型上同名方法时,会按照原型链从下往上查,直到到第一个匹配的方法为止。在下面的文章中,我们将探讨如何在JavaScript中使用原型继承,并介绍当调用原型上的同名方法时发生的情况。
介绍原型继承:
在JavaScript中,每个对象都有一个原型(prototype)属性,它指向一个对象。默认情况下,对象的原型是`Object.prototype`。当我们创建一个新对象时,它会继承原型对象的属性和方法。我们可以通过`ate()`方法来指定一个对象作为原型,从而将其属性和方法继承给新对象。
例子:
```javascript
var parent = {
name: "Parent",
sayHello: function() {
console.log("Hello from " + this.name);
}
};
var child = ate(parent); //继承parent的属性和方法
child.name = "Child"; //在子对象上重新定义name属性
child.sayHello(); //调用原型上的同名方法
```
在上面的例子中,我们使用`ate()`方法来创建了一个新对象`child`,并指定`parent`对象为其原型。这意味着`child`对象继承了`parent`对象的`name`属性和`sayHello()`
方法。我们还重写了`child`对象上的`name`属性,将其值设为"Child"。
当我们调用`child.sayHello()`时,JavaScript引擎首先在`child`对象上查是否有名为`sayHello`的方法。由于`child`对象本身没有这个方法,所以引擎会继续在`child`对象的原型链上查。在原型链中,它会到`parent`对象上的`sayHello`方法,并将其调用。在方法中,`this`关键字将引用当前调用方法的对象,即`child`对象。
当调用原型上的同名方法时,JavaScript会按照原型链从下往上的顺序查,直到到第一个匹配的方法为止。这意味着,即使在原型链的上层有其他对象也定义了同名方法,当调用时只会执行第一个匹配方法的代码。
下面我们来看一个更复杂的例子,演示原型继承和调用原型上的同名方法的过程:
```javascript
function Animal(name) {
this.name = name;
}
Animal.prototype.sayHello = function() {
console.log("Hello from " + this.name);
};
function Cat(name) {
Animal.call(this, name); //调用父构造函数初始化属性
}
Cat.prototype = ate(Animal.prototype); //继承父原型
structor = Cat; //修复constructor
Cat.prototype.sayHello = function() {
函数prototypeconsole.log("Meow from " + this.name);
};
var myCat = new Cat("Kitty");
myCat.sayHello(); //调用原型上的同名方法
```
在这个例子中,我们定义了一个`Animal`构造函数和一个`Cat`构造函数。`Cat`构造函数继承了`Animal`构造函数的属性,通过`Animal.call(this, name)`调用父构造函数来实现。然后,我们使用`ate()`方法将`Cat`的原型设置为`Animal`的原型,从而继承了`Animal`原型上的方法。最后,我们重写了`Cat`原型上的`sayHello`方法,将其输出修改为"Meow from "。