面向对象与原型一

JavaScript面向对象编程:从工厂模式到原型链的演进与实践 面向对象编程(OOP)是一种组织代码的核心思想,它通过封装、继承和多态等特性,将复杂系统抽象为相互协作的对象集合。其原理在于将数据与操作数据的方法绑定在一起,形成独立实体,从而提升代码的可维护性、复用性和扩展性。在JavaScript中,这一思想通过原型机制实现,为构建模块化、可复用的前端应用提供了技术基础。从工厂模式的手工创建,到构造函数模式的类型识别,再到原型模式的方法共享,最终通过原型链实现继承,这一演进过程解决了代码组织、内存效率和类型系统等工程实践中的关键问题。本文聚焦于JavaScript面向对 阅读详情

面向对象和原型

创建对象

var box=new Object();
box.name='chen';
box.age=26;
box.run=function() {
    return this.name+this.age;
}
alert(box.run());

var box2=new Object();
box2.name='jack';
box2.age=24;
box2.run=function(){
    return this.name+this.age;
}
alert(box2.run());

在以上情景模式中存在多个类似对象声明的问题

工厂模式

工厂模式优点:就是为了解决实例化对象产生大量重复的问题。创建一个集中实例化函数

function createObject(name,age){
    var obj=new Object();
    obj.name=name;
    obj.age=age;
    obj.run=function(){
        return this.name+this.age;
    }
    return obj;
}
var box1=createObject('chen',26);
var box2=createObject('jack',24);
alert(box1.run());//创建第一个实例化对象
alert(box2.run());//创建第二个实例化对象

在创建一个createObject2()

function createObject2(name,age){
    var obj=new Object();
    obj.name=name;
    obj.age=age;
    obj.run=function(){
        return this.name+this.age;
    }
    return obj;
}
alert(box1 instanceof Object);//true
alert(box2 instanceof Object);//true
alert(box3 instanceof Object);//true

box3与box1、box2明显属于不同的函数不同的对象,但又都是Object的对象,这样一来就无法区分谁到底是谁的对象

工厂模式缺点:无法区分谁到底是哪个对象的实例

构造函数

构造函数优点既解决重复实例化的问题也解决对象识别问题

构造函数与工厂函数的不同点:
* 造函数方法没有显示的创建对象(new Object())
* 直接将属性和方法赋值给 this对象没有return语句

然通过构造函数可以创建对象,那么这个对象是哪里来的, new Object()在什么地方
执行了?执行的过程如下

  • 1、当使用了构造函数并且new构造函数,那么后台自动执行了new Object()
  • 2、将构造函数作用域给新对象创建出的对象(new Object()。而函数体内的this就代表new Object出来的对象
  • 3、执行构造函数内的代码
  • 4、返回新对象
function Box(name,age){
    this.name=name;
    this.age=age;
    this.run=function(){
        return this.name+this.age;
    }
}
function Desk(name,age){
    this.name=name;
    this.age=age;
    this.run=function(){
        return this.name+this.age;
    }
}
var box1=new Box('chen',26);
var box2=new Box('jack',24);
var box3=new Desk('kkk',300);
alert(box1.run());//chen26
alert(box2.run());//jack24
alert(box3.run());//kkk300

alert(box1 instanceof Object);//true
alert(box1 instanceof Box);//true
alert(box2 instanceof Box);//true
alert(box3 instanceof Box);//false 识别出box3不属于Box而应该属于Desk
alert(box3 instanceof Desk);//true 证明box3属于Desk

构造函数和普通函数的唯一区别, 就是他们调用的方式不同。 只不过, 构造函数也是函
数,必须用new运算符来调用,用普通函数调用无效,否则就是普通函数

为了方便后面学习,这里探讨下两个实例化对象的run方法是否相等

function Box(name,age){
    this.name=name;
    this.age=age;
    this.run=function(){
        return this.name+this.age;
    }
}

var box1=new Box('chen',26);//实例化后地址是1
var box2=new Box('chen',26);//实例化后地址是2
alert(box1.name==box2.name);//true
alert(box1.age==box2.age);//true
alert(box1.run()==box2.run());//true 构造函数体内的方法的值是相等的
alert(box1.run==box2.run);//false 因为他们比较的是引用地址

构造函数缺点两个实例化后的属性或方法不相等

若果想要引用地址也是一致可以这样(通过构造函数外绑定同一个函数的方法来保证引用地址的一致性)

function Box(name,age){
    this.name=name;
    this.age=age;
    this.run=other
}
function other(){
    return this.name+this.age;
}

var box1=new Box('chen',26);//实例化后地址是1
var box2=new Box('chen',26);//实例化后地址是2
alert(box1.run()==box2.run());//true
alert(box1.run==box2.run);//true

原型

每创建一个函数都有一个prototype属性,这个属性是个对象,她的用途是包含可以有特定的所有实例共享的属性和方法,也就是说不洗在构造函数中定义对象信息,而是直接将这些信息添加到原型中

function Box(){}
Box.prototype.name='Lee';//原型属性
Box.prototype.age=100;//原型属性
Box.prototype.run=function(){//原型方法
    return this.name+this.age;
}
var box1=new Box();
var box2=new Box();
alert(box1.run==box2.run);//true 此时实例化的地址是一样的

如果是实例化方法,不同的实例化,他们的方法地址是不一样的,是唯一的
如果是原型方法,那么他们的地址是共享的
构造函数方法
构造函数方法
原型模式方法
原型模式方法

alert(box1.prototype);//undefined
alert(box1.__proto__);//[object,object]

在原型模式声明中,多了两个属性,这两个属性都是创建对象时自动生成的。proto属性是实例指向原型对象的一个指针,它的作用就是指向构造函数的原型属性constructor。通过这两个属性,就可以访问到原型里的属性和方法了

作用是被原型指针定位,然后得到构造函数本身,其实就是构造函数对象对应的原型对象
alert(box1.constructor);//function  Box(){}

isPrototypeOf()用来判断一个对象是否指向了该构造函数的原型对象
只要用new实例化对象,即都会指向原型

alert(Box.prototype.isPrototypeOf(box1));//true

//另外一个例子
var obj=new Object();
alert(Object.prototype.isPrototypeOf(obj));//true

原型模式的执行流程:
1、先查找构造函数实例中里的属性和方法,如果有,立刻返回;
2、如果构造函数里没有,则去它的原型对象里找,如果有,则返回。

可以用delete删除实例中的属性

hasOwnProperty()判断属性是在构造函数的实例里,还是在原型里

alert(box1.hasOwnProperty('name'));//实例里有返回true,否则返回false

in操作符判断属性是在原型里或者在实例中,无论属性是存在对象中还是存在原型中只要存在(且不管实例属性和原型属性是否存在,也是就该属性可以为空)就返回true,两边都没有就返回false

alert('name' in box);//true,存在实例中或原型中
function isProperty(obj,proterty){//封装函数判断是否在原型中存在
    return !obj.hasOwnProperty(proterty)&&proterty in obj;
}

构造函数实例属性和原型属性示意图
构造函数实例属性和原型属性示意图
为了让属性和方法更好的体现封装效果,并减少不必要的输入,原型的创建可以使用字面量的方法:

function Box(){}
Box.prototype={
    name:'Lee',
    age:100,
    run:function(){
        return this.name+this.age;
    }
}
//其中Box.prototype={}相当于new Object()
var box=new Box();
alert(box.constructor);//function Object(){}

使用构造函数创建原型对象和使用字面量创建对象在使用上基本相同,但还是有一些区别,字面量创建的方式使用constructor属性不会指向实例,而会指向Object,构造函数创建的方式则相反

function Box(){}
Box.prototype.name='Lee';//原型属性
Box.prototype.age=100;//原型属性
Box.prototype.run=function(){//原型方法
    return this.name+this.age;
}
var box=new Box();
alert(box.constructor);//function Box(){}

字面量方法为什么constructor会指向object?
因为其中Box.prototype={}相当于创建了一个新对象,新对象的constructor重写了Box原来的constructor因此会指向新对象。

//重写原型,以前的name属性和run方法都被覆盖
Box.prototype={
    age:200
}

原型的声明是有先后顺序的,所以重写原型会切断之前的原型(覆盖之前所有的原型对象的属性和方法)

原型模式缺点:原型模式省略了构造函数传参初始化这一过程,带来的缺点就是初始化的值都是一致的而原型最大的有点也是它最大的缺点,就是共享。
原型中所有的属性被很多实例共享,共享对函数非常合适,对于包含基本值的属性也还可以。但如果属性包含引用类型,就存在一定的问题

function Box() {};
Box.prototype = {
    constructor : Box,
    name : 'Lee',
    age : 100,
    family : ['父亲', '母亲', '妹妹'],            //添加了一个数组属性
    run : function () {
        return this.name + this.age + this.family;
    }
};
var box1 = new Box();
box1.family.push('哥哥');//在实例中添加'哥哥'
alert(box1.run());

var box2 = new Box();
alert(box2.run());//共享带来的麻烦,也有'哥哥'了
面向对象编程&原型与原型链 对象是什么?为什么要面向对象?面向对象的优势在哪里? 阅读详情

相关推荐

JavaScript 原型与原型链:深入理解面向对象编程

我们的目的是帮助大家深入理解 JavaScript 中的原型和原型链概念,以及它们在面向对象编程中的应用。我们会从基础概念讲起,逐步深入到实际代码示例,让大家不仅知道是什么,还能明白怎么用。本文首先会介绍相关的术语,然后通过有趣的故事引入原型和原型链的概念,接着详细解释核心概念及其之间的关系,给出原理和架构的示意图。之后会介绍核心算法原理和具体操作步骤,展示数学模型和公式,通过项目实战进行代码分析。再探讨实际应用场景,推荐相关工具和资源,分析未来发展趋势与挑战。

AI架构全栈开发实战笔记 1076

面向对象以及原型

面向对象的特点,以及原型和原型链

weixin_51405694的博客 190

【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略

本文全面解析了JavaScript中的继承机制,核心围绕原型链这一核心概念展开,阐述了其在对象继承中的作用与重要性,并介绍了几种主要的继承实现方式。以下是文章内容的概括:📌原型基础每个JavaScript对象都隐含一个属性,通常通过__proto__访问,指向创建它的构造函数的prototype对象。构造函数的prototype本身是个对象,包含可被实例共享的方法和属性。示例展示了如何通过原型链,实例能访问到构造函数原型上的方法。📌原型链的形成与查找规则。

Allen- 2269

面向对象与原型

对象的创建:1 创建一个对象var obj = new Object(); obj.name = 'haha'; obj.showName = function(){ alert(obj.name); } obj.showName(); <strong>缺点</strong>:当我们想创建多个面向对象的时候,重复代码过多,需要封装,所以有了工厂方法。2 工厂方式f...

caimaomaocai的博客 282

pdf.js 移动端手势缩放功能实现与原生事件集成

本文详细解析了如何为pdf.js的viewer.html移动端页面实现流畅的双指捏合手势缩放功能。通过深入分析pdf.js的缩放机制,并利用原生触摸事件(touchstart、touchmove、touchend)进行集成,在不修改核心源码的前提下,为用户提供媲美原生应用的顺滑缩放体验,有效提升了移动端PDF阅读的专业性和用户满意度。

brandy的博客 490

ipsec 加密流程(一):ipsec策略匹配

《openswan》专栏系列文章主要是记录openswan源码学习过程中的笔记。 Author: Toney Email: vip_13031075266@163.com Date: 2020.11.22 Copyright: 未经同意不得转载!!! Version:2.6.51.5 Reference:https://download.openswan.org/openswan/ 1. ipsec策略匹配流程(ipsec_tunnel_start_xmit) 注:open...

遇见你是我最美丽的意外 9121

【JavaScript】——剖析面向对象与原型(一)

在面向对象与原型一章中,感觉还是挺有意思的,而且视频讲解的也很清楚,在这里总结归纳一下视频里 讲的内容,顺便整理整理自己的思路。 首先画一张图,理一下这一整章的知识点。 下面针对具体的知识点去剖析各个知识点间的关系: 工厂模式 工厂模式的引出,是为了避免在创建对象过程中产生大量重复的问题。它封装了在创建对象过程一些重复 的代码,避免了

努力成为自己的榜样。 1013

别再为授权费头疼了!手把手教你免授权搞定西门子、马扎克等12种主流数控机床的数据采集

本文提供了一套免授权采集西门子、马扎克等12种主流数控机床数据的实战指南,帮助中小型机加工车间节省80%以上的采集成本。通过TCP/UDP协议逆向工程和跨平台数据整合,实现经济、灵活且可持续的数据采集方案,涵盖设备兼容性处理、数据频率优化等关键问题。

weixin_26873711的博客 707

面向对象的原型:prototype,原型链

面向对象的原型:prototype,原型链

YY的博客 368

01-嵌入式入门-如何看原理图

最近由于找到的工作是偏于嵌入式方向,因此又重新开始学习已经丢弃两年的知识。新手学习知识感觉有一个通病:喜欢收集各种各样的视频、资料,网盘里收藏一大堆,但是却从没有打开看过,到头来还是个小白,只听说过几个概念,而实际却是不知所云,这就是所谓的"学习综合征"。而我也是其中的一员,最近痛定思痛,就准备根据一套资料沉下心学习下去,不再进入收集资料的大军。...

weixin_34010566的博客 4484

【人工智能之深度学习】21. 自动驾驶感知实战:YOLOv4复杂天气优化方案(BDD100K全代码+效果对比)

摘要:自动驾驶摄像头在雨雾天气下易受图像模糊、目标遮挡影响,导致YOLOv4检测精度骤降。本文基于BDD100K公开数据集(含多天气场景),设计三阶段优化方案:1)物理建模生成雨雾效果(雨滴线条+大气散射模型),将恶劣天气样本占比从20%提升至40%;2)在YOLOv4颈部嵌入CBAM注意力机制,强化模糊区域特征提取;3)L1剪枝(30%)+TensorRT量化实现轻量化。需特别说明:本文为教学虚拟案例,不可直接用于车载部署,实际落地需结合多传感器融合与ISO 26262认证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1684

面向对象

面向对象 是一种编程思维 所有的程序中的参与的对象提取出来,给对象 设置不同的属性和方法 面向对象优点:方便代码的管理,和封装 以及调用 面向过程 将程序 所有步骤:拆成一步一步 如何创建对象 1,字面量 var obj = { 属性:值, 属性2:值2, 方法:function(){ } } 使用属性和方法 obj.属性名 obj.方法名 赋值 obj.属性名 = 值 obj.方法 = fun...

weixin_45183986的博客 216

振镜控制卡硬件接口揭秘:XY2-100/SL2-100协议对比

本文对比分析了工业振镜控制领域两种主流数字通信协议XY2-100和SL2-100的硬件接口差异与应用场景。XY2-100作为开放式协议兼容性强,采用LVDS差分信号传输,适用于激光打标等中高精度场景;SL2-100为半封闭协议,采用RS485差分信号,专为高速响应场景设计。文章详细解析了两种协议的引脚定义、通信机制和性能参数,指出XY2-100适配多品牌振镜且调试简单,SL2-100则更适合Nutfield专用设备的高速高精度需求。最后提供了接口调试的实操建议和选型逻辑,强调应根据具体应用场景的精度、速度和

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 639

JavaScript面向对象与原型(一)

面向对象谈对象 一切事物皆对象对象具有封装和继承特性对象与对象之间使用消息通信,各自存在信息隐藏 对象(object),台湾译作物件,是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。 在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),...

weixin_30527143的博客 124

深度学习时间序列预测:GRU算法构建多变量时间序列预测模型+代码实战

深度学习多变量时间序列预测:GRU算法构建多变量时间序列预测模型+代码实战 注意参考:深度学习多变量时间序列预测:GRU算法构建单变量时间序列预测模型+代码实战 GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。 GRU和LSTM在很多情况下实际表现上相差无几,那么为什么我们要使用新人GRU(.

data+scenario+science+insight 4033

对雷达中相位补偿概念的一些理解

基于多普勒相位补偿的速度扩展方法和DBF测角,两者本质上都是对相位进行补偿。

qq_42235129的博客 4030

JavaScript之面向对象与原型(一)

一、创建对象 ECMAScript有两种开发模式:1.函数式(过程化);2.面向对象(OOP);面向对象语言有一个标志,就是有类的慨念,而通过类可以创建任意多个具有相同属性和方法的对象。但是,ECMAScript没有类的慨念,所以它的对象与基于类的语言的对象有所不同。 1、JS中普通创建对象的方法 var box = new Object(); box.name = 'wu'; box.ag

Danie_wu的博客 323

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深入理解js中的面向对象与原型、原型链(一)

深入理解js中的面向对象与原型、原型链(一)

baidu_33164415的博客 426

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JavaScript 进阶(一)——面向对象编程与原型模式

本博客学习书籍:《JavaScript设计模式与开发实践》 本博客学习章节:第一章 原型模式与面向对象编程 动态类型语言 编程语言按照是否定义数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言。JavaScript就是一种动态类型语言,定义到调用都不用管变量的类型。 // 定义a时不需要管它的类型 // 在 F12-Console 台,依次输入下面每行的代码,都是OK的 var a; a = 1; a += '-aaa' a = [1,2,3] a = new Date() 静态类型.

qq_32886245的博客 403

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JavaScript面向对象编程(一)原型与继承

原型(prototype) JavaScript是通过原型(prototype)进行对象之间的继承。当一个对象A继承自另外一个对象B后,A就拥有了B中定义的属性,而B就成为了A的原型。JavaScript中定义了Object.create()方法。该方法创建一个对象,将方法的第一个参数作为所创建对象的原型(这个方法支持可选的第二个参数,用于对对象的属性进行描述,详细可以参考《JavaScript...

weixin_30755393的博客 96

构造函数与原型链和面向对象的学习(一)

下面文章所有的例子(关于什么是构造函数) 例子中完整的js代码在文章最下面 第一个例子 function fun() { this.name = "小明"; this.age = 12; this.sex = "男"; console.log("aa")//"aa"" } var obj = new fun(); ...

qq_39148344的博客 281

面向对象建模技术之设计模式——原型模式

本文为大家介绍了设计模式——原型模式,详细为大家介绍了原型模式动机、模式定义、模式结构、模式分析示例代码、浅克隆与深克隆、clone()、实例一:邮件复制(浅克隆)、实例二:邮件复制(深克隆)、原型模式的优缺点、模式适用环境、模式应用,希望对你有帮助~~

weixin_53919192的博客 776

JavaScript面向对象编程:从工厂模式到原型链的完整指南

面向对象编程(OOP)是一种组织代码的核心思想,通过封装数据和操作来构建可维护的软件结构。其原理在于将相关属性和方法聚合为独立对象,实现高内聚低耦合。在JavaScript中,这一思想通过独特的原型机制实现,提供了灵活的对象创建与继承方案。从工厂模式、构造函数模式到原型模式,每种模式都解决了特定场景下的代码复用与内存管理问题。最终,组合使用构造函数与原型模式成为最佳实践,而ES6的class语法是其优雅的语法糖。理解这些模式对于构建现代前端应用至关重要,尤其在Vue、React等框架的组件设计中,面向对象的

weixin_34174105的博客 390

80V/8A异步降压控制器实战:从BUCK原理到48V转12V模块设计

降压型DC-DC变换器是电源系统中最常见的拓扑结构之一,其中异步BUCK因结构简单、可靠性高,在工业供电、电池组和通信设备等高压输入场景中依然占据重要地位。理解异步降压的工作原理,掌握电感、MOSFET、续流二极管等关键器件的匹配计算方法,是完成高性能电源模块设计的核心前提。在工业总线、储能设备和电机驱动等系统中,宽压输入、高效率、低纹波的降压转换需求普遍存在。本文以一款80V/8A异步降压控制器IP6702为例,围绕48V转12V/8A的实际案例,系统梳理了电感选型、功率MOS管匹配、输出电容配置、PCB

weixin_33787529的博客 171

【JavaScript】面向对象——原型与原型链(详解)

在JavaScript中,函数是一个包含属性和方法的类型的对象。而原型就是类型对象的一个属性。在函数定义时就包含了属性,它的初始值是一个空对象。在JavaScript中并没有定义函数的原型类型,所以原型可以是任何类型。原型是用于保存对象的共享属性和方法的,原型的属性和方法并不会影响函数本身的属性和方法。......

qq_49002903的博客 1943

JavaScript 中的面向对象编程--->构造函数--->原型对象与原型链,由浅入深详细讲解!

今天给大家分享JavaScript 中的面向对象编程--->构造函数--->原型对象与原型链,由浅入深详细讲解!并提供具体代码帮助大家深入理解,彻底掌握!

共同学习,共同成长 2133
上一篇: 进制间的转换
下一篇: 面向对象与原型二
chentian888
博客等级 码龄11年 16粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值