📜  原型,__proto__ - Javascript (1)

📅  最后修改于: 2023-12-03 15:22:51.165000             🧑  作者: Mango

原型和 proto - Javascript

在Javascript中,每个对象都有一个原型,或称为 prototype。原型充当了对象的基本模板,定义了对象的默认属性和方法,可以被继承或复制。

创建原型

创建原型的方法是通过构造函数,构造函数利用 prototype 属性添加方法和属性。

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.talk = function() {
  console.log("Hello, my name is " + this.name);
};

let john = new Person("John", 30);
john.talk(); // Output: "Hello, my name is John"

在上面的例子中,Person 是一个构造函数,它有两个参数:nameage。我们通过 new 操作符创建了一个新的 Person 实例 john

接着,我们使用 Person.prototype 来添加方法 talk,实现一个人物角色的对话功能。最后,我们调用 john.talk(),输出 Hello, my name is John

__proto__ 属性

每个Javascript对象都有一个 __proto__ 属性,用于表示该对象的原型。换句话说,__proto__ 属性指向该对象所继承的原型对象。

下面是一个例子,说明 __proto__ 的用法。

function Animal() {}

let cat = new Animal();

console.log(cat.__proto__ === Animal.prototype); // Output: true

在上面的例子中,我们创建了一个空的构造函数 Animal,然后使用 new 操作符创建了一个新的实例对象 cat

console.log() 方法中,我们将 cat.__proto__Animal.prototype 进行比较,从而确定它们是否相等。因为每个Javascript对象的 __proto__ 属性指向其所继承的原型对象,所以当我们比较 cat.__proto__Animal.prototype 时,输出的结果为 true

原型链

原型链是一条沿着 __proto__ 属性向上查找的链接,直到找到一个 null 值。对于Javascript中的每个对象,都可以建立一个原型链。

下面是一个例子,说明原型链的构建方式:

function Animal() {}

function Cat() {}

Cat.prototype = new Animal();

let fluffy = new Cat();

在上面的例子中,我们定义了 AnimalCat 两个构造函数。接着,我们将 Cat.prototype 指向一个新的 Animal 实例,从而创建一个原型链。最后,我们使用 new 操作符创建一个实例对象 fluffy

当我们调用 fluffy.toString() 时,Javascript会向上查找 fluffy.__proto__.__proto__,并在 Animal.prototype 对象中找到 toString() 方法。

总结

在Javascript中,每个对象都有一个原型,或称为 prototype。原型充当了对象的基本模板,定义了对象的默认属性和方法,可以被继承或复制。

每个Javascript对象都有一个 __proto__ 属性,用于表示该对象的原型。换句话说,__proto__ 属性指向该对象所继承的原型对象。

原型链是一条沿着 __proto__ 属性向上查找的链接,直到找到一个 null 值。对于Javascript中的每个对象,都可以建立一个原型链。