function Person(name, age) {
this.name = name;
this.age = age;
}
// 在 Person 构造函数的原型上添加一个 greet 方法
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}.`);
};
const person1 = new Person('Alice', 30);
const person2 = new Person('Bob', 25);
person1.greet(); // 输出 "Hello, my name is Alice."
person2.greet(); // 输出 "Hello, my name is Bob."
在上面的代码中,创建了一个Person对象,有通过person创建了person1和person2对象,这两个对象都关联到 Person.prototype
原型对象,并且可以共享 greet
方法。Object.prototype
)。function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}.`);
};
const person1 = new Person('Alice', 30);
console.log(person1.toString()); // 输出 "[object Object]"
在这个例子中 person1通过原型链继承了toString方法。
所以是Object.prototype
原型链的顶端,它是所有对象的原型,包括内置对象和自定义对象。当查找属性或方法时,原型链会一直往上查找,直到 Object.prototype
。如果在整个原型链上都找不到该属性或方法,则返回 undefined
。
原型继承是通过原型链来实现对象间的属性和方法共享。在原型继承中,一个对象可以从另一个对象继承属性和方法,这样可以实现对象之间的复用和扩展。
原型继承的基本概念如下:
Object.prototype
,它是 JavaScript 中所有对象的原型。undefined
。在原型继承中,我们可以通过构造函数的原型对象来共享属性和方法。当使用 new
关键字调用构造函数创建对象时,新对象会关联到该构造函数的原型,从而继承原型上的属性和方法。
下面是一个使用原型继承的简单示例:
// 定义一个 Person 构造函数
function Person(name) {
this.name = name;
}
// 在 Person 的原型上添加一个 greet 方法
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}.`);
};
// 使用 Person 构造函数创建两个对象
const person1 = new Person('Alice');
const person2 = new Person('Bob');
// 调用对象的 greet 方法
person1.greet(); // 输出 "Hello, my name is Alice."
person2.greet(); // 输出 "Hello, my name is Bob."
在上面的代码中,Person
构造函数的原型对象上有一个 greet
方法,通过 new Person()
创建的对象(例如 person1
和 person2
)会共享这个方法。这样,我们可以通过原型继承在多个对象之间共享方法,提高代码的重用性和可维护性。
需要注意的是,原型继承只能继承原型上的属性和方法,而不能继承构造函数内部的局部变量。如果需要更灵活的继承方式,可以考虑其他方式,例如组合继承、原型式继承、寄生式继承等。
function Parent(name) {
this.name = name;
}
Parent.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}.`);
};
function Child(name, age) {
Parent.call(this, name); // 构造函数继承
this.age = age;
}
Child.prototype = Object.create(Parent.prototype); // 原型链继承
Child.prototype.constructor = Child;
const child = new Child('Alice', 5);
child.greet(); // 输出 "Hello, my name is Alice."
function createPerson(proto, age) {
const newPerson = createObject(proto); // 原型式继承
newPerson.age = age; // 增强对象
newPerson.introduce = function() {
console.log(`I am ${this.name} and I am ${this.age} years old.`);
};
return newPerson;
}
const person = {
name: 'Alice',
greet: function() {
console.log(`Hello, my name is ${this.name}.`);
}
};
const newPerson = createPerson(person, 30);
newPerson.greet(); // 输出 "Hello, my name is Alice."
newPerson.introduce(); // 输出 "I am Alice and I am 30 years old."
function Parent(name) {
this.name = name;
}
Parent.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}.`);
};
function Child(name, age) {
Parent.call(this, name); // 构造函数继承
this.age = age;
}
Child.prototype = Object.create(Parent.prototype); // 原型链继承
Child.prototype.constructor = Child;
const child = new Child('Alice', 5);
child.greet(); // 输出 "Hello, my name is Alice."
function Animal(name) {
this.name = name;
}
function Dog(name, breed) {
Animal.call(this, name);
this.breed = breed;
}
const dog = new Dog('Buddy', 'Golden Retriever');
console.log(dog.name); // 输出 "Buddy"