JavaScript 精粹 基础 进阶(9)OOP面向对象编程(下)

转载请注明出处

原文连接 http://blog.huanghanlian.com/article/5b698f22b8ea642ea9213f51

我们怎么去模拟重载,在javasceipr中我们可以通过参数的类型区别或者数量的区别,来去让同样一个函数名字,可以根据不同的参数列表的情况来去调用相应的函数。

javascript中函数类型是不确定的,并且参数的个数也是可以任意的,那么我们可以通过判断实际传入的参数的个数,来去做一个模拟的重载,

OOP(模拟重载、链式调用、模块化)

模拟重载

    function person() {
        var args = arguments;
        if (typeof args[0] === ‘object‘ && args[0]) {
            if (args[0].name) {
                this.name = args[0].name;
            }
            if (args[0].age) {
                this.age = args[0].age;
            }
        } else {
            if (args[0]) {
                this.name = args[0];
            }
            if (args[1]) {
                this.age = args[1];
            }
        }
    };
    person.prototype.toString = function() {
        return "姓名:" + this.name + "年龄:" + this.age
    }

    var peng = new person({
        name: "继小鹏",
        age: 23
    });
    console.log(peng.toString()); //姓名:继小鹏年龄:23

    var peng1 = new person("是你", 23);
    console.log(peng1.toString()); //姓名:是你年龄:23

调用子类方法

例子1

    if (!Object.create) {
        Object.create = function(proto) {
            function F() {};
            F.prototype = proto;
            return new F();
        };
    }

    function person(name) {//基类
        this.name=name;
    }
    person.prototype.init=function(){
        console.log("你好"+this.name)
    }

    function student(name,classname){   //学生类
        this.classname=classname;
        person.call(this,name);
    }

    student.prototype = Object.create(person.prototype);
    student.prototype.constructor = student;

    student.prototype.init=function(){
        console.log("你好s"+this.name)
    }

    var peng=new student("继小鹏","class2");
    console.log(peng);
    peng.init();

例子2子类调用基类方法

function person(name) {//基类
    this.name=name;
}

function student(name,classname){   //学生类
    this.classname=classname;
    person.call(this,name);
}

person.prototype.init=function(){
    console.log(this.name)
}

student.prototype.init=function(){
    person.prototype.init.apply(this,arguments);
}

var peng=new student("继小鹏","class2");
console.log(peng);
peng.init();

链式调用

function classman() {}
classman.prototype.addClass = function(str) {
    console.log(‘calss‘ + str + ‘added‘);
    return this;
}
var mang = new classman();
mang.addClass(‘classA‘).addClass(‘classB‘).addClass(‘classC‘)

// calssclassAadded
// calssclassBadded
// calssclassCadded

使用jq的时候$("#id").addClass(‘df‘)
选择器做些操作后在继续addClass(‘df‘)还可以再做动作一层层链式去调用。

例子解释

function classman() {}   //现定义一个构造器classman
classman.prototype.addClass = function(str) {   //给classman构造器prototype添加addClass属性方法
    console.log(‘calss‘ + str + ‘added‘);   //输出表示添加一个class
    return this;  //return this表示返回classman的实例因为返回了实例那么紧接着后面不需要加mang.addClass(‘classA‘)直接后面加.addClass(‘classB‘).addClass(‘classB‘)就可以,每次执行完都会返回实例
}
var mang = new classman();
mang.addClass(‘classA‘).addClass(‘classB‘).addClass(‘classC‘)

// calssclassAadded
// calssclassBadded
// calssclassCadded

抽象类

function Detectorlse() {
    throw new Error("Abstract class can not be invoked directly!");
}
Detectorlse.detect = function() {
    console.log(‘Detcetion starting...‘);
}
Detectorlse.stop = function() {
    console.log(‘Detector stopped‘);
}
Detectorlse.init = function() {
    throw new Error("Error");
}

function linkDetector() {};
linkDetector.prototype = Object.create(Detectorlse.prototype)
linkDetector.prototype.constructor = linkDetector;

//...add methods to LinkDetector...

defineProperty(ES5)

function Person(name) {
    Object.defineProperty(this, ‘name‘, {
        value: name,
        enumerable: true
    });
};
Object.defineProperty(Person, ‘arms_num‘, {
    value: 2,
    enumerable: true
});
Object.seal(Person.prototype);
Object.seal(Person);

function student(name, classname) {
    this.classname = classname;
    Person.call(this, name);
};
student.prototype = Object.create(Person.prototype);
student.prototype.constructor = student;

var peng = new Person(‘继小鹏‘);
console.log(peng);

var han = new student("汗", "class2");
console.log(han);

模块化

定义简单模块化

var moduleA;
moduleA=function(){
    var prop=1;
    function func(){};
    return {
        func:func,
        prop:prop
    }
}();

定义简单模块化2

var moduleA;
moduleA = new function() {
    var prop = 1;

    function func() {};
    this.func = func;
    this.prop = prop;
}();

实践(探测器)

原文地址:https://blog.51cto.com/14229967/2359702

时间: 2024-07-29 08:52:28

JavaScript 精粹 基础 进阶(9)OOP面向对象编程(下)的相关文章

JavaScript 精粹 基础 进阶(8)OOP面向对象编程(上)

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698f14b8ea642ea9213f50 面向对象编程,oop并不是针对与javascript,很多语言都实现了oop这样一个编程发法论,比如说java,c++,都是实现了oop的语言. 概念与继承 概念 面向对象程序设计(Object-oriented programming OOP)是一种程序设计范型,同时也是一种程序开发的方法.对象指的是类的实例,它将对象作为程序的基本单元,将程序和

JavaScript 精粹 基础 进阶(5)数组

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698ee6b8ea642ea9213f4d 数组是值的有序集合.每个值叫做元素,每个元素在数组中都有数字位置编号,也就是索引.JS中的数组是弱类型的,数组中可以含有不同类型的元素.数组元素甚至可以是对象或其它数组. 第一节.创建数组.数组操作 数组概述 数组是值的有序集合.每个值叫做元素,每个元素在数组中都有数字位置编号,也就是索引.JS中的数组是弱类型的,数组中可以含有不同类型的元素.数组

JavaScript 精粹 基础 进阶(7)函数和作用域(闭包、作用域)

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698f05b8ea642ea9213f4f 闭包在JavaScript?中是一个非常重要的概念. 闭包例子 function outer() { var loc = 30; return loc; }; console.log(outer()); //30 outer函数是一个函数声明,有一个局部变量loc赋值为30,返回loc. 当这个函数调用之后,局部变量就会被释放了, function

JavaScript 精粹 基础 进阶(3)语句

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698ec8b8ea642ea9213f4b 语句 语句.严格模式 JavaScript程序由语句组成,语句遵守特定的语法规则.例如:if语句, while语句, with语句等等. 语句种类 块 block 块语句常用于组合0 ~ 多个语句.块语句用一对花括号定义. 语法: { 语句1; 语句2; ... 语句n; } 比如 { var str = "hi"; console.lo

JavaScript 精粹 基础 进阶(2)表达式和运算符

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698e88b8ea642ea9213f4a 表达式和运算符 JavaScript 表达式 表达式是指能计算出值得任何可用程序单元.--Wiki 表达式是一种JS短语,可使JS解释器用来产生一个值.--<JS权威指南> JavaScript 运算符 三元运算符 c ? a : b var val = true ? 1 : 2; // val = 1 //val值为true就会返回冒号前面的值

JavaScript 精粹 基础 进阶(6)函数和作用域(函数、this)

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698ef6b8ea642ea9213f4e 函数是一块JavaScript代码,被定义一次,但可执行调用多次,js中的函数也是对象,所以js函数可以像其他对象那样操作和传递所以我们也常叫js中的函数为函数对象. 函数概述 函数的构成主要有几个部分函数名,参数列表,函数体 function foo(x, y) { if (typeof x === 'number' && typeof y

JavaScript 精粹 基础 进阶(1)数据类型

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698e54b8ea642ea9213f49 数据类型 JavaScript六种数据类型 JavaScript一共有六种数据类型,其中有五种原始类型,和一种对象类型. JavaScript 隐式转换 var x='The answer'+42;//The answer42 var y=42+'The answer';//42The answer 这里的加号可以理解为字符串的拼接 var x="

JavaScript 精粹 基础 进阶(4)对象

转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5b698ed6b8ea642ea9213f4c 对象中包含一系列属性,这些属性是无序的.每个属性都有一个字符串key和对应的value. JavaScript 对象概述 概述 对象中包含一系列属性,这些属性是无序的.每个属性都有一个字符串key和对应的value. var obj = {x : 1, y : 2}; //定义obj对象, 有两个属性x和y obj.x; // 1 //访问对应ob

Python基础-第七天-面向对象编程进阶和Socket编程简介

本篇内容: 1.面向对象编程进阶-静态方法 2.面向对象编程进阶-类方法 3.面向对象编程进阶-属性方法 4.面向对象编程进阶-特殊成员(内置方法) 5.面向对象编程进阶-反射 6.异常处理.断言 7.Socket编程简介 一.面向对象编程进阶-静态方法 1.静态方法的实现 通过@staticmethod装饰器可以把其装饰的方法变为一个静态方法: 变成静态方法后,形参中可以不用写self了.如果写了self,默认是不会把对象本身传递给self,需要手动传递: class Dog(object):