javascript---面向对象:构造函数

首先javascript是基于对象的,即对象无处不在。

本节我们来讲讲js的构造函数。

创建对象实例有两种方法:第一种是工厂模式,第二种是构造函数

1.工厂模式

 1     function CreateObject(name,age){
 2             var obj=new Object();
 3             obj.name=name;
 4             obj.age=age;
 5             obj.run=function(){
 6             return this.name+this.age+‘运行中······‘;
 7             }
 8         return obj;
 9         }
10         var box1=CreateObject(‘Lee‘,100);
11         var box2=CreateObject(‘kkk‘,200);
12         alert(box1.run());
13         alert(box2.run());  

2.构造函数

    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(‘Lee‘,100);            //实例化对象
    var box2=new Box(‘kkk‘,200);
    var box3=new Desk(‘jack‘,300);
    alert(box1.run());
    alert(box2.run());
    alert(box3.run());
    alert(box1 instanceof Box);                //解决了对象识别问题
    alert(box3 instanceof Desk);

解答:构造函数相比工厂模式,解决了对象识别的问题,即可以区别开实例化的对象。



构造函数中涉及了一些问题:

补充:

• 内存:函数是引用类型的,其地址是固定的,存放在栈中,栈里的内存分配是固定的,所以基本类型的值都存放在栈中;而地址对应的值则存放在堆中,堆内的内存分配不固定。

• 调用:当调用函数时,由于函数是引用类型,首先先在栈中找到其地址,然后再在堆中找到相应的值;而基本类型则是直接在栈中寻找并返回。

 1     function Box(name,age){
 2         this.name=name;
 3         this.age=age;
 4         this.run=function(){
 5             return this.name+this.age+‘运行中······‘;
 6         }
 7     }
 8     function Desk(name,age){
 9         this.name=name;
10         this.age=age;
11         this.run=function(){
12             return this.name+this.age+‘运行中······‘;
13         }
14     }
15     var box1=new Box(‘Lee‘,100);            //实例化对象
16     var box2=new Box(‘Lee‘,100);
17     alert(box1.age==box2.age);            //基本类型相等
18     alert(box1.age===box2.age);
19     alert(box1.run()==box2.run());            //函数的值相等
20     alert(box1.run==box2.run());            //函数的地址不同,引用类型

构造函数中的函数run在不断实例化时产生冗余,即不断的在内存中开辟新的空间,而函数的内容是相同的,对内存不利。

解决方案:

可以使他们的引用地址一样,在全局加同一个函数,使指向的地址一样,不过此方法不好,可以直接调用,有副作用

    function run(){
    return this.name+this.age+‘运行中······‘;
    }
    function Box(name,age){
        this.name=name;
        this.age=age;
        this.run=run;
        }
        function Desk(name,age){
            this.name=name;
            this.age=age;
            this.run=run;        }
        var box1=new Box(‘Lee‘,100);            //实例化对象
        var box2=new Box(‘Lee‘,100);
        alert(box1.run()==box2.run());            //函数的值相等
        alert(box1.run==box2.run);            //true
时间: 2024-08-06 07:57:30

javascript---面向对象:构造函数的相关文章

javascript面向对象——构造函数和原型对象

一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是用new创建对象时调用的函数,与普通唯一的区别是构造函数名应该首字母大写 function Person(){ this.age = 30; } var person1 = new Person(); console.log(person1.age);//30 根据需要,构造函数可以接受参数 function

Javascript面向对象编程(二):构造函数的继承

这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数. function Cat(name,color){ this.name = name; this.color = col

javascript面向对象系列第一篇——构造函数和原型对象

× 目录 [1]构造函数 [2]原型对象 [3]总结 前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是用new创建对象时调用的函数,与普通唯一的区别是构造函数名应该首字母大写 function Person(){ this.age = 30; } var person1 = new Person(); console.log(person1.ag

Javascript面向对象编程(二):构造函数的继承 作者:yuan一峰

Javascript面向对象编程(二):构造函数的继承 作者: 阮一峰 日期: 2010年5月23日 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数. function

JavaScript面向对象及相关知识

最近在学习JavaScript面向对象,写下自己的理解及相关资料,以备查阅. 一.面向对象中涉及的相关几个概念 1.作用域 所谓作用域,就是说属性和函数的可访问范围.在JavaScript中,作用域分为两种.全局作用域和局部作用域. 所有没有var 声明 或 定义于最外层函数和最外层函数外面即为全局作用域.也就是定义可以随意调用. 自定义函数内部用var声明的为局部作用域. var num = 1; //全局作用域 window.onload = function() { //最外层为全局作用域

javascript面向对象之this指针

下午用面向对象的方法写一个幻灯片插件的时候不小心写出了这样的代码: Slider.prototype.auto=function() { setInterval(this.toRun,4000);//注意 } Slider.prototype.toRun=function() { if(this.iNow==this.aA.length - 1) ...... } 在浏览器打开的时候发现幻灯片不能如预期般自动切换,控制台给出了这样的错误提示: this.aA isundefined?然而我已经在

javascript面向对象2

原文:javascript面向对象2 首先我们先创建一个对象 var user = Object(); user.name = "张三"; user.age = 20; user.sex = "男"; 上面呢创建了一个对象,当然创建对象的方法有很多种,但是用这样的方法创建对象比较简单直观,也是JavaScript种创建对象最基本的方法. 同时呢也出现了另外一个弊端,当我们想要创建多个对象的时候,我们就要写很多重复的代码,这样一来就增加了代码量,减少了工作的效率, 为

Javascript 面向对象编程(一):封装

学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学习笔记,希望对大家学习这个部分有所帮助.我主要参考了以下两本书籍: <面向对象的Javascript>(Object-Oriented JavaScript) <Javascript高级程序设计(第二版)>(Professional JavaScript for Web Developers, 2nd

《Javascript面向对象精要》笔记

刚读过<Javascript面向对象精要>这本书,在现有的知识体系里面有一些新鲜的认识,记录一下. 原始类型和引用类型 Javascript存在两种类型:原始类型和引用类型.原始类型包括String.Number.Boolean.Null.Undefined,引用类型保存对象,其本质是对象所在内存位置的引用. 原始类型的赋值或者给函数传参,实际上都是传递原始类型值的拷贝: 引用类型则是引用的拷贝.修改其中一个引用的话,其他引用也会受到影响.如果对象中的某个属性也是对象,在对象拷贝时就会引入深拷

javascript面向对象系列5——知识点(原型和原型链)

基本概念 [原型链]每个构造函数都有一个对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.那么,如果原型对象等于另一个原型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针.如果另一个原型又是另一个原型的实例,那么上述关系依然成立.如此层层递进,就构成了实例与原型的链条. [原型对象]这个对象包含可以由特定类型的所有实例共享的属性和方法.所有引用类型默认都继承了Object,而这个继承也是通过原型链实现