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

yizhihongxing

浅谈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获取Request中参数的值方法

    让我们来详细讲解使用JavaScript获取Request中参数的值方法的完整攻略。获取Request参数值的过程分为两个步骤: 获取当前URL中所有参数的键值对 根据需要获取指定参数的值 获取当前URL中所有参数的键值对 通过以下代码可以获取当前URL中的所有参数的键值对: function getAllUrlParams(url) { var query…

    JavaScript 2023年6月11日
    00
  • JS搜狐面试题分析

    下面我将为你详细讲解“JS搜狐面试题分析”的完整攻略。 1. 题目分析 首先,需要了解这道面试题的要求和限制。根据题目描述,我们需要完成以下几个任务: 输入一个数字n,生成一个由n个随机数字组成的数组arr; 计算数组中所有数值的平均数avg,并以最多两位小数的形式输出; 找出数组中最接近平均数的数字,并输出其值。 2. 解题思路 解题思路可分为以下几个步骤…

    JavaScript 2023年5月28日
    00
  • $()JS小技巧

    $()JS小技巧 在前端开发中,我们经常需要对DOM元素进行操作,而jQuery库可以帮助我们更方便地实现这些操作。其中一个最常用的方法是$(),它可以获取DOM元素并对其进行操作。 基本语法 $()是jQuery的一种基本语法,它可以通过选择器来选取HTML元素,并返回一个jQuery对象。基本语法如下: $(selector).action() 其中的s…

    JavaScript 2023年5月18日
    00
  • 动态加载JavaScript文件的3种方式

    当我们开发一个网站时,经常需要用到Javascript代码来处理交互逻辑和动态效果。通常,为了让代码更清晰、易于维护,我们会将Javascript代码分离到一个或多个独立的文件中。这时就需要用到动态加载Javascript文件的功能。下面介绍3种常用的方式: 1. 通过DOM创建script元素 动态加载Javascript文件最常用的方式就是通过DOM创建…

    JavaScript 2023年5月27日
    00
  • 利用js-cookie实现前端设置缓存数据定时失效

    利用js-cookie实现前端设置缓存数据定时失效的步骤如下: 第一步:安装和引入js-cookie 在使用js-cookie之前,需要在你的项目中安装它。你可以通过npm或者使用CDN的方式安装js-cookie。 在实际使用时,需要在你的HTML文件中引入js-cookie,例如: <script src="js-cookie.js&qu…

    JavaScript 2023年6月11日
    00
  • js判断一个字符串是否包含一个子串的方法

    要判断一个字符串是否包含一个子串,可以使用JavaScript中的indexOf()方法或者includes()方法。 使用indexOf()方法 indexOf()方法可以在一个字符串中查找给定的子串,如果找到了则返回该子串第一次出现的位置,如果没有找到则返回-1。因此,我们可以根据该方法返回的结果来判断该子串是否包含在目标字符串中。 代码示例: let …

    JavaScript 2023年5月28日
    00
  • 深入理解JavaScript中Ajax

    “深入理解JavaScript中Ajax”的完整攻略如下: 理解Ajax Ajax(Asynchronous JavaScript and XML)即异步JavaScript和XML,可以实现异步服务器调用。它能在不重新加载整个页面的情况下更新页面的部分内容,从而提高网页的交互体验。 Ajax的核心用到了XMLHttpRequest对象,它可以使用XMLHt…

    JavaScript 2023年5月18日
    00
  • JavaScript中的类(Class)详细介绍

    下面是关于JavaScript中的类的详细介绍: 什么是类? 在计算机编程中,类是一种重要的概念。类是由数据和代码组成的数据类型,是一种面向对象的编程思想。JavaScript中的类就是一个模板,它描述了一个对象应该有哪些属性和方法。 如何定义一个类? 在JavaScript中,定义一个类使用class关键字,语法如下: class 类名 { // 构造函数…

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