JS原型链通俗解析:人、妖与代码的故事

1 下载量 141 浏览量 更新于2024-08-28 收藏 267KB PDF 举报
"小白谈谈对JS原型链的理解" 在JavaScript中,原型链是一个核心概念,它涉及到对象之间的继承和属性查找机制。以下是对标题和描述中所述知识点的详细解释: 1)对象实例化:在JavaScript中,当我们创建一个对象时,比如`var person = new Person()`, `person`就是`Person`构造函数的实例,这里的`Person.prototype`就是`person`的原型。原型也是对象,因此可以拥有自己的属性和方法。 2)构造函数:构造函数用于创建特定类型的对象,例如`Person`函数就是一个构造函数。当我们使用`new`关键字调用构造函数时,会创建一个新的对象并将其关联到构造函数的原型。 3)原型对象与构造函数的关系:每个构造函数都有一个`prototype`属性,这个属性指向一个对象,这个对象就是用来提供给构造函数实例共享的属性和方法。通过原型对象,我们可以访问到构造函数的信息。 4)原型的唯一性:每个对象实例都有唯一的`__proto__`属性,指向它的原型对象。这意味着多个对象实例可以共享同一个原型,从而实现属性和方法的复用。 5)原型链:当试图访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript会沿着`__proto__`链向上查找,直到找到该属性或者到达`null`(原型链的终点)。这就形成了原型链。 6)原型链终止于`null`:原型链不是无限的,当查找的路径达到`null`时,表示已经到达了原型链的顶端,无法再向上查找。 7)继承:通过原型链,子对象可以继承父对象的属性和方法。就像人继承了人的特征,妖继承了妖的特征。 8)属性查找与覆盖:如果子对象和原型都定义了同名属性,子对象的属性会覆盖原型的属性,这就是所谓的“属性覆盖”。 9)向上搜索:当尝试访问一个对象的属性,如果对象本身没有,就会向上遍历原型链,直到找到该属性。 10)对象的可变性:尽管对象实例不能直接修改原型的属性,但可以通过创建新的属性来覆盖原型上的属性。 11)属性共享:所有从同一原型链继承的对象都共享相同的属性,这意味着修改原型上的属性会影响到所有实例。 12)原型的动态性:原型对象是可变的,可以添加或删除属性,甚至可以替换整个原型,这会影响基于该原型的所有对象实例。 13)原型整体重写:当通过`Object.create()`或`__proto__`直接设置新的原型时,旧的原型链会被切断,形成新的原型链。 14)原型方法的引用:当对象的某个方法是通过原型链引用的,即使改变了原型,原有的引用也不会立即更新,除非重新获取引用。 示例代码: ```javascript function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log('Hello, ' + this.name); } var person1 = new Person('Alice'); person1.sayHello(); // Hello, Alice Person.prototype = { sayHello: function() { console.log('Bonjour, ' + this.name); } }; // person1.sayHello(); // 这里不会立即输出'Bonjour', 因为引用没有重新获取 person1.__proto__.sayHello(); // Bonjour, Alice ``` 以上就是对JavaScript原型链的全面解析,通过这个生动的比喻,希望能帮助你更好地理解和应用这个重要的编程概念。