“类”的设计模式

news/2024/7/8 1:55:41

“类”的设计模式

类的设计模式:实例化、继承和(相对)多态。

JavaScript通过原型链,在两个对象之间创建一个关联。这样,一个对象就可以通过委托访问另一个对象的属性和函数,从而达到“继承”的实现。

下面来看一个例子:

function Foo(name) {
  this.name = name;
}
Foo.prototype.myName = function () {
  return this.name;
};
function Bar(name, label) {
  Foo.call(this, name);
  this.label = label;
}
Bar.prototype = new Foo(); //实现prototype的关联
Bar.prototype.myLabel = function () {
  return this.label;
};
var a = new Bar("a", "obj a");
a.myName(); // "a"
a.myLabel(); // "obj a"

构造函数和实例原型的关系图(红色的就是原型链)

实例原型图

原型prototype

每个函数都有一个prototype属性,函数的prototype属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型。例子中Bar.prototype就是实例a的原型。

proto

这是每一个JavaScript对象(除了 null )都具有的一个属性,叫__proto__,这个属性会指向该对象的原型。

a.__proto__ === Bar.prototype //true
Bar.prototype.__proto__ === Foo.prototype //true

constructor

constructor,每个原型都有一个 constructor 属性指向关联的构造函数。

Foo === Foo.prototype.constructor

为了方便理解,这里我们简单模拟实现new

function objectFactory() {
  var obj = new Object(),Constructor = [].shift.call(arguments);
  obj.__proto__ = Constructor.prototype;
  var ret = Constructor.apply(obj, arguments);
  return typeof ret === 'object' ? ret : obj;
};

下面介绍,另外两种写法:

Object.create(行为委托设计模式)

var Foo = {
  init: function(name){
    this.name = name;
  },
  myName: function(){
    return this.name;
  }
};
var Bar = Object.create(Foo);
Bar.setup = function(name, label){
  // 委托调用
  this.init(name);
  this.label = label;
};
Bar.myLabel = function(){
  return this.label;
};
var a = Object.create( Bar );
a.setup("a", "obj a");
a.myName(); // "a"
a.myLabel(); // "obj a"

简单模拟实现Object.create

Object.create = function (o) {
  var F = function () {};
  F.prototype = o;
  return new F();
};

class(class 语法可以简洁地定义类方法)

class Foo {
  constructor(name) {
    this.name = name;
  }
  myName() {
    return this.name;
  }
}
class Bar extends Foo {
  constructor(props, label) {
    super(props);
    this.label = label;
  }
  myLabel() {
    return this.label;
  }
}
var a = new Bar("a", "obj a");
a.myName(); // "a"
a.myLabel(); // "obj a"

http://www.niftyadmin.cn/n/4388556.html

相关文章

dubbo的一些默认变量

dubbo默认变量表 变量名描述默认值用途DEFAULT_IO_THREADS默认IO线程Math.min(Runtime.getRuntime().availableProcessors() 1, 32)创建NettyServer和MinaServer时DEFAULT_PROXY默认代理,javassist通过生成字节码代替反射DEFAULT_PAYLOAD默认最大数据大小8 * 1024 …

互联网创新创业大赛优秀范例_第五十九期创业沙龙——“互联网+”大学生创新创业大赛实践案例...

原标题:第五十九期创业沙龙——“互联网+”大学生创新创业大赛实践案例第五十九期创业沙龙第六届“互联网”、2020年“创青春”系列竞赛开赛在即,为对我校参赛师生进行赛前培训,利用线上培训进行有效指导,提升学生的创…

leetcode-201-数字范围按位与

题目描述&#xff1a; 给定范围 [m, n]&#xff0c;其中 0 < m < n < 2147483647&#xff0c;返回此范围内所有数字的按位与&#xff08;包含 m, n 两端点&#xff09;。 示例 1: 输入: [5,7] 输出: 4 示例 2: 输入: [0,1] 输出: 0 要完成的函数&#xff1a; int ran…

ParserError: Error tokenizing data. C error: Expected 2 fields in line 15, saw 4

pandas 读取泰坦尼克号数据&#xff0c;报错 %matplotlib inline import numpy as np import pandas as pd import re as retrain pd.read_csv(D:/titanic/train1.csv, header 0, dtype{Age: np.float64}) test pd.read_csv(D:/titanic/test.csv , header 0, dtype{Age: n…

html 怎么放置图片上,css怎么放图片?

随着互联网的发展&#xff0c;网速不断提升&#xff0c;我们现在的网页也变的更加丰富起来&#xff0c;除了能够传输文字外&#xff0c;我们还可以传输图片。我们该如何使用css在网页中放图片&#xff1f;下面我们俩看一下使用css在网页中放图片的方法。css可以使用background简…

玩转SSH端口转发

SSH有三种端口转发模式&#xff0c;本地端口转发(Local Port Forwarding)&#xff0c;远程端口转发(Remote Port Forwarding)以及动态端口转发(Dynamic Port Forwarding)。对于本地/远程端口转发&#xff0c;两者的方向恰好相反。动态端口转发则可以用于科学上网。 SSH端口转发…

python使用socket实现双工通讯

import socket def send_msg(udp_socket): “”“发送消息”"" # 获取需要发送的类容 send_data input(“请输入需要发送的类容&#xff1a;”) # 获取ip端 dest_ip input(“请输入对方的ip:”) dest_port int(input(“请输入对方的端口&#xff1a;”)) # 发送数…

python如何求水仙花数

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number)&#xff0c;水仙花数是指一个 3 位数&#xff0c;它的每个位上的数字的 3次幂之和等于它本身。 简单来说&#xff…