JS构造函数和实例化的关系及原型引入

目录
  • 1、 构造函数与实例化
  • 2、构造函数与实例化之间的关系?
  • 3、per1.say是否等于per2.say
  • 4、per1.say不等于per2.say得出的结论
  • 5、举例代码问题
    • 5.1代码出现的问题
    • 5.2优化代码解决造成空间浪费
    • 5.3处理使用这种方法,我们还可以使用原型的方式

1、 构造函数与实例化

当我们的编程是面向对象的时候,先是抽象的过程=>然后实例化的过程,比如我们抽象一个人,我知道一个人的基本信息。名称,年龄,性别,....等等

我们把先是抽象的,在抽象完成后,我们在实例化。

2、构造函数与实例化之间的关系?

//这个自定义的构造函数在抽象

function Person(name,age,sex){

    this.name=name;

    this.age=age;

    this.sex=sex;

    this.say=function(){

        console.log("我叫",name)

    }

}

// 这个过程是实例化

let per1=new Person('司藤',300,'女');

per1.say();//调用

//let per1=new Person('司藤',300,'女');

通过上面这一行代码。

我们可以得出一个结论:

构造函数与实例对象之间的关系是:

实例对象需要通过构造函数来创建的。

同时:我们可以知道实例对象的构造器就是构造函数

我们来证明这一句话是否正确;上面的代码不改变。

console.log( per1.constructor===Person ) //返回的是true

充分说明:实例对象的构造器就是构造函数这一句话是正确的。

3、per1.say是否等于per2.say

 function Person(name,age,like) {

    this.name=name;

    this.age=age;

    this.like=like;

    this.say=function(){

        console.log('我可以不吃饭');

    }

}

var per1=new Person("司藤",300,'耍');

var per2=new Person('白浅','10000','耍');

per1.say();

per2.say();

console.log( per1.say==per2.say ) //false

4、per1.say不等于per2.say得出的结论

因为console.log( per1.say==per2.say ) //false

我们可以得出一个结论。

那就是per1.say()和per2.say()调用的不是同一个方法

那么他们的内容是否是相等的的呢?

console.log( per1.say()==per2.say() ) //true

说明内容是相等的

5、举例代码问题

5.1代码出现的问题

function Person(name,age,like) {

    this.name=name;

    this.age=age;

    this.like=like;

    this.say=function(){

        console.log('我可以不吃饭');

    }

};

for (var index = 0; index < 100; index++) {

    var per=new Person("司藤",300,'耍');

    per.say();

}

这一段代码:是它在内存中开辟了100个空间。每个空间都有一个say方法。但是每一个say方法都是不同的。可是他们输出的内容是相同。或者说执行的逻辑是相同的。这样就造成了空间浪费。所以在项目中,这样就造成了浪费空间。

我们可不可以来优化呢 ?

5.2优化代码解决造成空间浪费

function comSay(){

    // 执行相同的逻辑

    console.log('我可以不吃饭')

};

function Person(name,age,like) {

    this.name=name;

    this.age=age;

    this.like=like;

    this.say=comSay;//不要加括号

};

var per1=new Person("司藤",300,'耍');

var per2=new Person('白浅','10000','耍');

console.log( per1.say==per2.say ) //true

这样我们就节约了空间。每次调用的时候,都是同一个方法。

5.3处理使用这种方法,我们还可以使用原型的方式

function Person(name,age,like) {

    this.name=name;

    this.age=age;

    this.like=like;

};

Person.prototype.comSay=function(){

    console.log('我可以不吃饭')

}

var per1=new Person("司藤",300,'耍');

var per2=new Person('白浅','10000','耍');

console.log( per1.comSay==per2.comSay ) //true

// 我们还可以通过原型来解决数据共享

原型的作用:数据共享,节约空间。

到此这篇关于JS构造函数和实例化的关系及原型引入的文章就介绍到这了,更多相关JS构造函数和实例化的关系及原型引入内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript知识:构造函数也是函数

    目录 1.构造函数的定义与调用 2.new关键字的用途 3.构造函数的问题:浪费内存 总结 首先要明确的是构造函数也是函数 我经常使用构造函数来创建实例对象,例如对象和数组的实例化可以通过相应的构造函数Object()和Array()完成. 构造函数与普通函数在语法的定义上没有任何区别,主要的区别体现在以下3点. (1)构造函数的函数名的第一个字母通常会大写.按照惯例,构造函数名称的首字母都是要大写的,非构造函数则以小写字母开头.这是从面向对象编程语言那里借鉴的,有助于在ECMAScript中区

  • 详解JavaScript原型对象的this指向问题

    目录 一.this指向 二.修改this指向 1.call()方法 2.apply()方法 总结 一.this指向 构造函数中的this 指向实例对象.那么原型对象this的指向呢? 如下: function Student(age,name){ this.age = age; this.name = name; } var that; Student.prototype.score = function(){ console.log('孩子们成绩都很好!'); that = this; } v

  • JavaScript类继承及实例化的方法

    本文实例讲述了JavaScript类继承及实例化的方法.分享给大家供大家参考.具体如下: (function(){ var Class = { //扩展类 create: function(aBaseClass, aClassDefine){ var $class = function(){ for(var member in aClassDefine){ this[member] = aClassDefine[member]; } if('undefined'===typeof aClassD

  • javascript中使用new与不使用实例化对象的区别

    我们先来看个实例 function Me(name,age,job){ this.name = name; this.age = age; this.job = job; } 请问这以下两种实例化对象方式有什么区别呢? var mefun1 = new Me('fei','20','it'); var mefun2 = Me('fei','20','it'); 简单的说 第一种是构造函数式,即通过new运算符调用构造函数Function来创建函数 第二种不是实例化,只是调用函数把返回值赋给变量.

  • JS Object构造函数之Object.freeze

    概述 Object.freeze(obj)可以冻结一个对象.一个被冻结的对象再也不能被修改: 冻结了一个对象则不能向这个对象添加新的属性,不能删除已经属性,不能修改该对象已有属性的可枚举性.可配置性.可写性.以及不能修改已有属性的值. 此外,冻结一个对象后该对象的原型也不能被修改.freeze()返回和传入的参数是相同的对象. JavaScriptDemo: Object.freeze() const obj = { prop:42 } Object.freeze(obj) obj.prop =

  • 浅谈javascript构造函数与实例化对象

    前言--讲在前面 我想有很多以前很少接触后台编程语言的初学者朋友跟我一样,对javascript里面一系列的"名词"搞的一头雾水.好像大概知道讲的是什么,但其实理解的还是不清楚:我想,学习任何一种知识,首当其冲应该把最基本的名词解释搞清楚(知道它讲的到底是什么,有助于我们更好的理解它.)即知其然知其所以然,这样对以后的进阶学习是很有帮助的.下面的简单讲一下我自己对这样一些看似不重要但又不得不清楚的知识点的理解.(若有出入,欢迎指正) 1.什么是构造函数 构造函数 ,是一种特殊的方法.主

  • JavaScript构造函数原理及实现流程解析

    在学习构造函数之前我们需要知道我们学习构造函数需要学习什么: 1.什么是构造函数 2.构造函数用来做什么 3.构造函数的执行过程 4.构造函数的返回值 1.所以首先我们需要知道什么是构造函数: 在我看来,构造函数具有两个特点可以判断是否为构造函数: 1.当函数名为首字母大写时,这个是一个可以大概判断构造函数与普通函数的一个特点,但是不是绝对正确,因为普通函数也可以是大写字母开头 2.当我们需要调用构造函数时我们需要new <构造函数>,也就是产生一个实例化对象. function Studen

  • 详解JavaScript中的原型和原型链

    目录 原型链图 原型必备知识 prototype属性(显示原型) proto属性(隐式原型) constructor属性 总结 原型链图 原型必备知识 要了解原型就必须搞清三个属性:__proto__.prototype. constructor. 1.__proto__. constructor属性是对象所独有的: 2.prototype属性是函数独有的: 3.js中函数也是对象的一种,那么函数同样也有属性__proto__. constructor: 原型五大规则: 1.所有引用类型(对象,

  • JS构造函数和实例化的关系及原型引入

    目录 1. 构造函数与实例化 2.构造函数与实例化之间的关系? 3.per1.say是否等于per2.say 4.per1.say不等于per2.say得出的结论 5.举例代码问题 5.1代码出现的问题 5.2优化代码解决造成空间浪费 5.3处理使用这种方法,我们还可以使用原型的方式 1. 构造函数与实例化 当我们的编程是面向对象的时候,先是抽象的过程=>然后实例化的过程,比如我们抽象一个人,我知道一个人的基本信息.名称,年龄,性别,....等等 我们把先是抽象的,在抽象完成后,我们在实例化.

  • 浅谈js构造函数的方法与原型prototype

    把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype属性上的情况我们简称为prototype上的方法. •函数内的方法: 使用函数内的方法我们可以访问到函数内部的私有变量,如果我们通过构造函数new出来的对象需要我们操作构造函数内部的私有变量的话, 我们这个时候就要考虑使用函数内的方法. •prototype上的方法: 当我们需要通过一个函数创建大量的对象,并且这些对象还都有许多的方法的时候;这时我们就要考虑在函数的prototype上添加这些方法. 这种情况下我们代码的

  • JS构造函数与原型prototype的区别介绍

    构造函数方法很好用,但是存在一个浪费内存 通过原型法分配的函数是所有对象共享的. 通过原型法分配的属性是独立.-----如果你不修改属性,他们是共享 如果我们希望所有的对象使用同一一个函数,最好使用原型法添加函数,这样比较节省内存. 例子: //----构造函数模式 为Cat对象添加一个不变的属性"type"(种类),再添加一个方法eat(吃老鼠).那么,原型对象Cat就变成了下面这样: <script> function Cat(name, color) { this.n

  • js构造函数constructor和原型prototype原理与用法实例分析

    本文实例讲述了js构造函数constructor和原型prototype原理与用法.分享给大家供大家参考,具体如下: 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型) 所有函数拥有prototype属性(显式原型)(仅限函数) 原型对象:拥有prototype属性的对象,在定义函数时就被创建 __proto__, prototype和constructor 下面这三个属性的定义非常重要,始终贯穿在原型中. prototype:此属性只有构造函数才有,它指向的是当前构造函数

  • 详解JS构造函数中this和return

    先看一段代码, function Foo(name,age){ this.name=name; this.age=age; } var foo=new Foo("Tom",14); foo.name;//Tom foo.age;//14 使用构造函数实例化发生的流程: 1.建立一个foo的空对象. 2.将构造函数中的Foo的this指向对象foo. 3.foo的_proto_属性指向Foo函数的prototype原型. 4.执行构造函数中的代码. 相对于普通函数,构造函数中的this是

  • [js高手之路]图解javascript的原型(prototype)对象,原型链实例

    我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉. function CreateObj(uName) { this.userName = uName; } CreateObj.prototype.showUserName = function(){ return this.userName; } var obj1 = new CreateObj('ghostwu'); var obj2 = new CreateObj('卫庄')

  • js构造函数创建对象是否加new问题

    今天看到这样一道题: 填写"TO DO"处的内容让下面代码支持a.name = "name1"; b.name = "name2"; function Obj(name){ // TO DO } obj. /* TO DO */ = "name2"; var a = Obj("name1"); var b = new Obj; 问题1:new操作符做了些什么呢? 创建一个新对象: 将构造函数的作用域赋给新对

  • js prototype和__proto__的关系是什么

    我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法.(这个对象下面有个属性,这个属性是另外一个对象的应用 ,这个属性就是一个对象.) function是对象,function的原型prototype也是对象,它们都会具有对象共有的特点.即:对象具有属性__proto__,每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__prot

  • 几句话带你理解JS中的this、闭包、原型链

    原型链 所有对象都是基于Object.prototype,Object.prototype就是JavaScript的根对象,在Object.prototype中定义的方法都可以被其它对象访问到,当然也可以被重写了,所以直接在Object.prototype上调用的是原始功能的toString()方法,该方法会放回参数对象的内置属性[[class]]的值,这个值是个字符串,比如'[Object String]' 要理解原型链机制的话,首先得知道根本原因:JavaScript中的对象都有一个内置属性

  • 有关于JS构造函数的重载和工厂方法

    写在前面 有时候我们希望对象的初始化有多种方式.比如通过元素组成的数组来初始化一个Set对象,而不是通过传入构造函数的参数列表来初始化它 重载overload 通过重载这个构造函数方法让它根据传入参数的不同,来执行不同的初始化方法. 复制代码 代码如下: function Set() {this.values = {}; // 用这个对象的属性保存这个集合this.n = 0; // 集合中值的个数 // 如果传入一个类数组的对象,将这个元素添加到集合中// 否则,将所有的参数都添加到集合中if

随机推荐