JS是一种基于对象的语言。在使用过程中不免遇到复制对象的问题。但通常我们採用的直接赋值‘obj1=obj2’这样的做法会出现数据覆盖问题。

也就是对象引用过程中引用地址一致。导致对象数据被改动的问题。这时我们能够採用工厂模式来对对象进行实例化,从而实现对象的引用地址一致导致的数据覆盖问题。

但此时,问题随之又来了,使用工厂模式,对于详细的实例所属的详细对象又搞不清楚,在JS中採用构造方法来解决对象实例的数据覆盖问题(这里和其他语言的原理是类似的)。

一、构造函数

在其他语言中接触过构造函数。通常它与类的名称一致。但在JS中并没有明白的‘类’这个概念。

在我看来,它声明的对象从某种程度上说就是一种类。由于它的每一个对象都能够有自己相应的实例。

构造函数解决数据覆盖:

<span style="font-family:KaiTi_GB2312;font-size:18px;">
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+'执行中...';
} }</span>

对它进行调用:

<span style="font-family:KaiTi_GB2312;font-size:18px;">	var box1=new Box('lee',22);
var box2=new Desk('john',66); </span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">        alert(box1 instanceof Box);//TRUE
alert(box2 instanceof Box); //能够识别详细哪个对象的实例。FALSE
</span>

同一时候。构造函数能够进行对象冒充,来改变对象自身的作用域。实现自身所不能实现的行为。

但同一时候,又引出了另外一个问题。构造函数体内对于引用类型数据引用地址出现不一致现象,这说明在内存中对于全然相等的两个或多个数据,要用相应大小的内存来盛放。这样无疑造成了内存浪费现象。当然,我们能够採用在构造函数体外将引用类型进行单独声明。可是这样的方法封装性非常差。非常easy被外界恶意调用。所以,这里JS中用到了原型。

二、原型

JS中创建的每个函数都有一个prototype原型属性。这个属性也是一个对象。它的用途是包括能够由特定类型的全部实例共享的属性和方法。

例如以下图所看到的,函数的原型对象为该函数的全部实例所共享。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3l5MTMw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="229" width="449">

上图中__proto__是原型对象的指针,它指向原型对象。同一时候constructor为原型对象的构造属性,运行详细的所属的构造函数对象。

在实际应用中能够通过constructor属性来改变一个原型对象所属的构造函数对象。

为函数创建原型属性和方法:

	function Box(){} //构造函数体内什么都没有,假设有,就叫做实例属性和实例方法

	Box.prototype.name='lee';//原型属性
Box.prototype.age=22;
Box.prototype.run=function(){ //原型方法
return this.name+this.age+'执行中...';
}

用这样的方法。能够解决上面遗留的引用地址不一致的问题(构造函数+原型)。

能够通过Box.prototype.isPrototypeOf(box1)来对实例所属的原型对象进行推断。

同一时候在创建函数的原型时,也能够通过字面量的方法来创建:

Box.prototype={
name:'lee',
age:100,
run:function(){
return this.name+this.age+'执行中...';
}
}

以上是有关JS中构造函数和原型函数的一些基础知识。小结一下:

1.构造函数在实例化时,必须使用new来操作。声明时不须要new object。隐含自身已经new了

2、构造函数能够用来解决对象实例化中数据覆盖问题,但会造成引用地址不一致问题

3、原型攻克了引用地址不一致问题

4、原型能够实现共享但不能进行重写。会将原来的信息覆盖。

对于重写问题。能够採用原型+构造函数结合来各司其职。后面再做具体总结。

JS基础——构造函数VS原型的更多相关文章

  1. JS中构造函数与原型对象的同名属性,实例会取哪一个

    构造函数与原型对象的同名属性,实例会取哪一个? 看了下面的过程,再回忆JS高程3里关于这部分的示意图.实例my在new的时候,本身就获得了a属性,所以my.a是1,倘若在new的时候如果没有赋予a属性 ...

  2. JS高级---构造函数通过原型添加方法,原型的作用: 共享数据, 节省内存空间

    JS高级---构造函数,通过原型添加方法,原型的作用: 共享数据, 节省内存空间 构造函数 //构造函数 function Person(sex, age) { this.sex = sex; thi ...

  3. js基础例子dom+原型+oop基础知识记录01

    //oo:概念是计算机中对于现实世界的理解和抽象的方法 //由计算机利用编程技术发展到现在的产物 //面向对象几要素 //对象:由属性和方法组成的集合 //属性:保存数据,存储在对象内存空间中的唯一的 ...

  4. JS基础:基于原型的对象系统

    简介: 仅从设计模式的角度讲,如果我们想要创建一个对象,一种方法是先指定它的类型,然后通过这个类来创建对象,例如传统的面向对象编程语言 "C++"."Java" ...

  5. js中构造函数的原型添加成员的两种方式

    首先,js中给原型对象添加属性和方法. 方式一:对象的动态特效 给原型对象添加成员 语法:构造函数.prototype.方法名=function (){ } 方式二:替换原型对象(不是覆盖,而是替换, ...

  6. 前端总结·基础篇·JS(一)原型、原型链、构造函数和字符串(String)

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...

  7. 【js基础】创建对象的几种常见模式(工厂模式,构造函数模式,原型模式,构造原型组合模式)

    一.工厂模式 缺点:没有解决对象识别的问题 优点:解决了创建多个相似对象的问题 function createPerson(name,age,job){ var o = new Object(); o ...

  8. JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

    说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...

  9. JS基础-该如何理解原型、原型链?

    JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...

随机推荐

  1. Hi3519V101 SDK安装以及开发环境搭建

    Hi3519V101 Linux开发环境 1.安装Hi3519V101 SDKHi3519V101 SDK是基于Hi3519V101 DMEB的软件开发包,包含了在Linux相关应用开发时使用的各种工 ...

  2. Ribbitmq

    rittbiMQ: 连接远程rabbitmq server sudo rabbitmqctl addser mihon mihon123 sudo rabbitmqctl set_permission ...

  3. iOS 唯一标示符 卸载后安装值不变

    Vindor标示符 (IDFV-identifierForVendor) 这种叫法也是在iOS 6中新增的,不过获取这个IDFV的新方法被添加在已有的UIDevice类中.跟advertisingId ...

  4. vue.js 利用SocketCluster实现动态添加数据及排序

    直接上代码 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  5. Leetcode 331.验证二叉树的前序序列化

    验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录下这个节点的值.如果它是一个空节点,我们可以使用一个标记值记录,例如#. 例如,上面的二叉树可以被序 ...

  6. Android ListView子item高度定长固定值无效问题

    在项目开发中遇到一个实际问题:ListView中,打算给每个子item设定一个具体的高度值如128dp,256dp,在子item中把根布局的高度值写死写成定长,但是不管怎么样,高度一直都没变化.开始以 ...

  7. 数组dome

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. URAL Formula 1 ——插头DP

    [题目分析] 一直听说这是插头DP入门题目. 难到爆炸. 写了2h,各种大常数,ural垫底. [代码] #include <cstdio> #include <cstring> ...

  9. 洛谷P3327 - [SDOI2015]约数个数和

    Portal Description 共\(T(T\leq5\times10^4)\)组数据.给出\(n,m(n,m\leq5\times10^4)\),求\[\sum_{i=1}^n\sum_{j= ...

  10. json格式前端显示

    使用angular可以稍加修改. [转]http://web.jobbole.com/82865/ function output(inp) { document.body.appendChild(d ...