浅谈JavaScript 覆盖原型以及更改原型

浅谈JavaScript 覆盖原型以及更改原型

什么是原型

JavaScript 中,每一个对象都有一个原型对象,原型对象中存储了这个对象的方法和属性。如果对象中没有此属性或方法,则会去原型对象中查找,如果原型对象中仍然找不到,再去原型的原型中查找,形成原型链。最终,如果在原型链中还是找不到,则返回 undefined。

下面是一个示例:

function Person() {}
Person.prototype.name = '张三';
Person.prototype.age = 20;
Person.prototype.sayName = function() { console.log(this.name); };

var person1 = new Person();
person1.sayName(); // 输出 "张三"

在这个示例中,定义了一个构造函数 Person,将其原型中的 name、age 和 sayName 方法分别设置为 '张三'、20 和打印 name 的方法。之后通过 Person 构造函数创建了一个实例 person1,最终输出 person1 的 name 属性,因为 name 属性在原型链中被找到了。

覆盖原型

在上面的示例中,我们可以修改 Person 的原型属性,来改变所有实例的属性。

Person.prototype.name = '李四';
person1.sayName(); // 输出 "李四"

在这里,我们将 Person 的原型属性 name 的值修改为 '李四',再次通过 person1.sayName() 输出,结果变为了 '李四'。

在这里,我们覆盖了原型属性 name,这意味着所有通过 Person 实例化的对象的 name 属性都会变成 '李四'。但是需要注意的是,如果一个实例对象中也有 name 属性,则该属性会覆盖原型中的属性。

更改原型

除了覆盖原型属性,我们还可以更改原型结构。

function Person() {}
Person.prototype = {
  job: '工程师',
  sayJob: function() { console.log(this.job); }
};
var person1 = new Person();
person1.sayJob(); // 输出 "工程师"

在这个示例中,同样定义了一个构造函数 Person,但是在这里传入了一个新的原型对象,包含了 job 和 sayJob 方法。这意味着实例化的对象也将继承 job 和 sayJob 方法,可以通过 person1.sayJob() 输出。

需要注意的是,在更改原型时,一定要在将新的原型对象赋值给构造函数的 prototype 属性后,再创建实例化对象,否则新的原型结构不会继承到实例化对象中。

示例说明

示例 1

function Animal(name) {
  this.name = name;
}
Animal.prototype.sayName = function(){
  console.log('My name is ' + this.name);
}

function Dog(name, color) {
  Animal.call(this, name);
  this.color = color;
}
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
Dog.prototype.sayColor = function() {
  console.log('My color is ' + this.color);
}

var dog1=new Dog('Doggy', 'white');
dog1.sayName(); // 输出 "My name is Doggy"
dog1.sayColor(); // 输出 "My color is white"

在这个示例中,我们定义了一个 Animal 构造函数,其中包含 name 属性和 sayName 方法。然后定义了一个 Dog 构造函数,通过原型继承 Animal 构造函数。

在 Dog 构造函数中,首先通过 Animal.call(this, name) 继承父类构造函数中的属性,因为使用了 call 方法绑定了 this,所以此时 Dog 对象中的 name 属性变成了传入的 name。

之后通过 Dog.prototype = new Animal() 将 Dog 的原型对象指向 Animal 的实例化对象,这样 Dog 的原型对象就可以继承 Animal 中的属性和方法了。

最后,我们添加了 Dog 特有的方法 sayColor 和发出输出。

示例 2

function Animal(name) {
  this.name = name;
}
Animal.prototype.sayName = function(){
  console.log('My name is ' + this.name);
}

function Dog(name, color) {
  Animal.call(this, name);
  this.color = color;
}

Dog.prototype = Object.create(Animal.prototype, {
  constructor: {
    value: Dog,
    enumerable: false,
    writable: true,
    configurable: true
  }
});

Dog.prototype.sayColor = function() {
  console.log('My color is ' + this.color);
}

var dog1=new Dog('Doggy', 'white');
dog1.sayName(); // 输出 "My name is Doggy"
dog1.sayColor(); // 输出 "My color is white"

这是上例中的另一种写法,使用了 Object.create() 方法继承 Animal 的原型对象,并且在修改 Dog 的原型对象时,指定了 constructor 属性的值和可枚举性。

需要注意的是,由于 constructor 的可枚举性被设置为 false,所以 Object.keys(Dog.prototype) 的结果不会包含 constructor。

总结

覆盖原型和更改原型是 JavaScript 中常见的操作,能够方便地扩展和修改对象的结构,改善代码的可读性和可维护性。但需要注意对原型结构和原型链的理解,以避免在操作中产生预期之外的行为。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈JavaScript 覆盖原型以及更改原型 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 基于JavaScript实现前端文件的断点续传

    首先,前端实现文件的上传需要使用HTML5新增的文件上传API,即File和FileReader对象。而实现文件的断点续传可以通过Ajax方式向后台传递文件分块,后台接口则可以将分块数据合并成完整的文件。 以下是一个完整的前端基于JavaScript实现文件的断点续传的攻略: 1. HTML页面设计 在HTML页面中需要添加一个文件上传的表单,和一个进度条用…

    JavaScript 2023年5月27日
    00
  • 用原生js做单页应用

    下面我将为大家详细讲解如何用原生JS做单页应用的完整攻略。 什么是单页应用? 单页应用(SPA)是指使用Ajax或Websocket等技术,使得网页只需加载一次,就能实现多个页面的效果。 用原生JS做单页应用的步骤 定义路由 要实现单页应用,首先需要定义路由,以此来控制页面的跳转和展示。可以使用window.history.pushState()方法或者lo…

    JavaScript 2023年6月11日
    00
  • 增强的 JavaScript 的 trim 函数的代码

    增强的 JavaScript 的 trim 函数可以去除字符串两端的空格,它是基于原生 JavaScript 的 trim() 函数的升级版。下面是实现增强的 JavaScript 的 trim 函数代码的攻略: 第一步:创建函数 首先,创建一个名为trimExtra的函数,代码如下: function trimExtra(str) { return str…

    JavaScript 2023年6月10日
    00
  • jquery控制listbox中项的移动并排序的实现代码

    要实现jquery控制listbox中项的移动并排序,需要以下几个步骤: 首先在HTML页面中创建两个列表框,这两个列表框分别是源列表框和目标列表框,即用户可以从源列表框中选择移动项目到目标列表框中。示例代码如下: <select id="sourceListBox" multiple> <option value=&q…

    JavaScript 2023年6月11日
    00
  • json数据处理及数据绑定

    下面是关于”json数据处理及数据绑定”的完整攻略。 什么是JSON数据? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript语言对象的表示法,但是独立于JavaScript并且易于理解和使用。JSON格式常用于前端开发中,用于数据传输和存储,是一种常用的数据格式。 JSON格式的数据包含键…

    JavaScript 2023年5月27日
    00
  • JavaScript sup方法入门实例(把字符串显示为上标)

    下面是详细的讲解。 JavaScript sup 方法入门实例(把字符串显示为上标) 什么是 sup 方法? sup 是 JavaScript 中字符串对象的方法之一,用于将指定文本显示为上标,即像 x²(表示 x 的平方)这样的效果。 sup 方法语法 stringObject.sup() 其中,stringObject 为要进行上标处理的字符串。 sup…

    JavaScript 2023年5月28日
    00
  • JS中去掉array中重复元素的方法

    下面我将详细讲解 JS 中去掉 array 中重复元素的方法的完整攻略。 方法一:使用 Set 去重 可以将数组转换为 Set 对象,然后再将 Set 对象转换为数组,就达到了去重的效果。 示例代码: const arr = [1, 2, 2, 3, 4, 4]; const set = new Set(arr); const newArr = Array.…

    JavaScript 2023年5月27日
    00
  • 解析Clipboard API剪贴板操作实例

    想要讲解”解析Clipboard API剪贴板操作实例”的完整攻略,需要分为以下几个部分:介绍Clipboard API、谈论Clipboard API的浏览器兼容性、解释如何使用Clipboard API进行剪贴板操作、展示两个具体的剪贴板操作示例。 一、什么是Clipboard API? Clipboard API是HTML5标准中新增的一个API。它提…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部