JavaScript类的写法

js类的基本含义

我们知道,在js中,是没有类的概念的。类的所有实例对象都从同一个原型对象上继承属性,因此,原型对象是类的核心。

类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。———百度百科

早期的javascript需求都很简单,基本都是写成函数的,然后是面向过程的写法,后来慢慢的引入面向对象开发思想,再后来就慢慢写成 

js中,写成类的本质基本都是 构造函数+原型。下面,就讨论一下js类的几种写法:

构造函数 法

/**
    * Person类:定义一个人,有name属性和getName方法
   */
    <script>
        function Person(name){
            this.name = name;
            this.getName = function(){
                return this.name;
            }
        }

        //我们在这里实例化几个对象

        var p1 = new Person("trigkit4");
        var p2 = new Person("mike");

        console.log(p1 instanceof Person);//true
        console.log(p2 instanceof Person);//true
    </script>

由上面控制台输出结果可知,p1和p2的确是类Person的实例对象。instanceof操作符左边是待检测类的对象,右边是定义类的构造函数。这里,instanceof用来检测对象p1是否属于Person类。

这种方式的优点是:我们可以根据参数来构造不同的对象实例 ,缺点是每次构造实例对象时都会生成getName方法,造成了内存的浪费 。

我们可以用一个外部函数来代替类方法,达到了每个对象共享同一个方法。改写后的类如下:

//外部函数
<script>
    function getName() {
        return this.name;
    }

    function Person(name){
        this.name = name;
        this.getName = getName;//
    }
</script>

原型方式

<script>
    function Person(){};
    Person.prototype.name = "trigkit4";//类的属性都放在prototype上
    Person.prototype.getName = function(){
        return " I‘m " + this.name;
    }

    var p1 = new Person();
    var p2 = new Person();
    console.log(p1.name);//trigkit4
    console.log(p2.getName());//I‘m trigkit4
</script>

原型方式的缺点就是不能通过参数来构造对象实例 (一般每个对象的属性是不相同的) ,优点是所有对象实例都共享getName方法(相对于构造函数方式),没有造成内存浪费 。

构造函数+原型方式

取前面两种的优点:
a、用构造函数来定义类属性(字段)。
b、用原型方式来定义类的方法。

<script>
    function Person(name){
        this.name = name;
    }

    //原型的特性可以让对象实例共享getName方法
    Person.prototype.getName = function(){
        return " I‘m " + this.name;
    }
</script>

这样,我们就既可以构造不同属性的对象,也可以让对象实例共享方法,不会造成内存的浪费。

为了让js代码风格更紧凑,我们让prototype方法代码移到function Person的大括号内。

<script>
    function Person(name){
        this.name = name;
        Person.prototype.getName = function(){
            return this.name;
        }
    }

    var p1 = new Person(‘trigkit4‘);
    console.log(p1.getName());//trigkit4
</script>

在这里,我们需要知道的几种定义类的方法,除了上面的构造函数外,还有:

Object.create()方法

用这个方法,"类"就是一个对象,而不是函数。

var Person = {
        name : "trigkit4",
        age : 21,
        run:  function(){
            alert("I like running");
        }
    }

然后,直接用Object.create()生成实例,不需要用到new。

var p1 = Object.create(Person);
    alert(p1.age);//21
    p1.run();//I like running

这种方法比"构造函数法"简单,但是不能实现私有属性和私有方法,实例对象之间也不能共享数据,对"类"的模拟不够全面。

createNew()方法

这种方法不需要用到this和prototype,其做法是用对象来模拟一个类,然后在类里面定义一个构造函数createNew(),然后在createNew()里面定义实例对象,把这个实例对象作为返回值。

<script>
    var Person = {

        createNew : function () {
            var person = {};
            person.name = "trigkit4";
            person.run = function(){
                alert("I like running");
            };
            return person;
        }

    }
</script>

使用的时候,调用createNew()方法,就可以得到实例对象。

var p1 = Person.createNew();
    p1.run();//I like running

这种写法其实和对象字面量的写法是很类似的,只不过一个是逗号分隔,一个是分号分隔。

时间: 2024-08-30 01:42:11

JavaScript类的写法的相关文章

第九章:Javascript类和模块

(过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某些属性,这种“共享”的特性是非常有用的.类的成员或实例都包含一些属性,用以存放它们的状态,其中有些属性定义了它们的行为(通常称为方法).这些行为通常是由类定义的,而且为所有实例所共享.例如,假如有一个名为complex的类用来表示复数,同时还定义了一些复数运算.一个complex实例应当包含复数的实

javascript定义对象写法

javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存[花花评:主要指方法,引用对象适合用此方法初始化,值对象其实无所谓] function User1(name, password) {this.name = name;this.password = password;this.login = function(name,password){if(this.na

javascript类继承

function extend(subClass, superClass) { var f = function() {}; f.prototype = superClass.prototype; subClass.prototype = new f(); subClass.superClass = superClass.prototype; } var parent = function (name, age) { this._name = name; this._age = age; };

ECMAScript 6 引入的 JavaScript 类(class)--类同java class

在 ECMAScript 6 引入的 JavaScript 类(class)是 JavaScript 现有的原型继承的语法糖. 类并不是 JavaScript 里加入的新的面向对象的继承模型.JavaScript 中的类只是能让我们用更简洁明了的语法创建对象及处理相关的继承. 定义类 类实际上是个"特殊的函数",而且正如函数的定义方式有函数声明和函数表达式两种一样,类的定义方式也有两种,分别是:类声明和类表达式. 类声明 类声明是定义类的一种方式,就像下面这样,使用 class 关键字

一种JavaScript 类的设计模式

一种JavaScript 类的设计模式尽管前面介绍了如何定义一个类,如何初始化一个类的实例,但既可以在function定义的函数体中添加成员,又可以用prototype 定义类的成员,代码显的很混乱,和面向对象语言类的实现之间有着很大的区别.那么,如何以一种清晰的方式来定义类呢?下面给出了一种类的实现模式,并将它们对应到面向对象语言类的实现上.类的构造函数用来初始化一个实例,是每个类必不可少的一部分.在传统意义的面向对象中,类的构造函数的名称和类的名称一致,同时它们的定义方式和类成员的定义是类似

ExtJS教程(2)--- Javascript类和对象基础知识

Javascript中的类其实就是一个function 如下面定义一个Person类 //定义一个类 function Person(){ this.name = 'jaune'; this.age = 18; } //创建一个对象 var person1 = new Person(); console.log(person1); /* * 控制台打出以下内容 * Person {name: "jaune", age: 18} */ 上面是一个简单的定义类及创建类的方法 //定义一个带

注入式类的写法,解耦,组件式开发,沙箱

沙箱(网络编程虚拟执行环境) Sandboxie(又叫沙箱,沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或者其他应用. 因此运行会产生的变化可以随后删掉. 它创造了一个类似沙盒的独立作业环境,在其中内部运行并不会对硬盘产生永久的影响. 其为一个独立的 虚拟环境,可用以测试不受信任的应用程序或上网行为. 沙箱是一种按照安全策略限制程序行为的执行环境. 早期主要用于测试可疑软件等,比如黑客们为了试用某种病毒或者不安全产品,往往可以将它们在沙箱环境中运行. 经典的沙箱系统的实现途经一般是通

JavaScript学习总结(十三)——极简主义法编写JavaScript类

前两天在网上无意中发现了一篇使用极简主义法定义JavaScript类的文章,原文链接,这个所谓的"极简主义法"我还是第一次听说,是荷兰程序员Gabor de Mooij提出来的,这种方法不使用this和prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因.下面就介绍如何使用极简主义法完成JavaScript的封装和继承 1. 封装 首先,它也是用一个对象模拟"类".在这个类里面,定义一个构造函数createNew(),

XML序列化和反序列化 以及相关类的写法

类的写法: 省网办数据对接中运用到 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; namespace SWBExchange.Common.Entities { public class Body { [XmlElement(ElementName = "BasicInfo")] public Ba