JS基础 原型与继承

本文深入探讨JavaScript的原型基础,包括原型对象、原型链、构造函数和继承。讲解了如何利用原型对象共享属性和方法,如何通过`__proto__`和`prototype`设置和获取原型,以及`constructor`在原型中的作用。还介绍了继承的实现,如`Object.create`,多态和原型工厂模式。此外,文章讨论了`this`在原型继承中的行为以及如何优化构造函数的使用,确保方法不被多次复制。最后,文章展示了如何通过`mixin`模式实现多继承的功能。
摘要由CSDN通过智能技术生成

阅读目录

原型基础

原型对象

每个对象都有一个原型 prototype 对象,通过函数创建的对象也将拥有这个原型对象。
原型是一个指向对象的指针。

  1. 可以将原型理解为对象的父亲,对象从原型对象继承来属性
  2. 原型就是对象除了是某个对象的父母外没有什么特别之处
  3. 所有函数的原型默认是 Object 的实例,所以可以使用 toString / toValues / isPrototypeOf等方法的原因。
  4. 使用原型对象为多个对象共享属性或方法
  5. 如果对象本身不存在属性或方法将到原型上查找
  6. 使用原型可以解决,通过构建函数创建对象时复制多个函数造成的内存占用问题
  7. 原型包含 constructor 属性,指向构造函数
  8. 对象包含 __proto__ 指向他的原型对象

使用数组原型对象的 concat 方法完成连接操作

下例使用的就是数组原型对象的 concat 方法完成的连接操作。

let hd = ["a"];
console.log(hd.concat("b"));
console.log(hd);

在这里插入图片描述

默认情况下创建的对象都有原型。

let hd = { name: "wgchen" };
console.log(hd);

在这里插入图片描述

以下 x、y 的原型都为元对象 Object,即JS中的根对象

let x = {};
let y = {};
console.log(Object.getPrototypeOf(x) == Object.getPrototypeOf(y)); //true
// Object.getPrototypeOf()方法返回指定对象的原型(即内部属性的值)。[[Prototype]]

创建一个极简对象(纯数据字典对象)没有原型(原型为 null)

我们也可以创建一个极简对象(纯数据字典对象)没有原型(原型为 null)

// hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

let hd = { name: 3 };
console.log(hd.hasOwnProperty("name")); // true

let xj = Object.create(null, {
  name: {
    value: "wgchen"
  }
});

console.log(xj.hasOwnProperty("name"));
// Uncaught TypeError: xj.hasOwnProperty is not a function

//Object.keys是静态方法,不是原型方法所以是可以使用的
console.log(Object.keys(xj));


console.log(xj);

在这里插入图片描述

函数拥有多个原型,prototype 用于实例对象使用,__proto__ 用于函数对象使用

function User() {}

User.__proto__.view = function() {
  console.log("User function view method");
};

User.view();

User.prototype.show = function() {
  console.log("wgchen");
};

let hd = new User();
hd.show();

console.log(User.prototype == hd.__proto__);

在这里插入图片描述

原型关系分析,与方法继承的示例

在这里插入图片描述

let hd = new Object();
hd.name = "wgchen";

Object.prototype.show = function() {
  console.log("blog");
};
hd.show();

function User() {}
let xj = new User();
xj.show();

User.show();

在这里插入图片描述

使用构造函数创建对象的原型体现

  1. 构造函数拥有原型
  2. 创建对象时构造函数把原型赋予对象

在这里插入图片描述

function User() {}
let xj = new User();
console.log(xj.__proto__ == User.prototype); // true

下面使用数组会产生多级继承即原型链

在这里插入图片描述

let hd = [];
console.log(hd);
console.log(hd.__proto__ == Array.prototype);

let str = "";
console.log(str.__proto__ == String.prototype);

下面使用 setPrototypeOfgetPrototypeOf 获取与设置原型

let hd = {};
let parent = { name: "parent" };
Object.setPrototypeOf(hd, parent);

console.log(hd);
console.log(Object.getPrototypeOf(hd));

在这里插入图片描述
使用自定义构造函数创建的对象的原型体现

在这里插入图片描述

function User() {}
let hd = new User();
console.log(hd);

constructor 存在于 prototype 原型中,用于指向构建函数的引用。

function hd() {
  this.show = function() {
    return "show method";
  };
}

const obj = new hd(); 
console.log(obj instanceof hd); //true

const obj2 = new obj.constructor();
console.dir(obj2.show()); //show method

使用对象的 constructor 创建对象

f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值