JavaScript(十三)面向对象

这篇博客详细介绍了JavaScript的面向对象概念,包括对象的创建方法如new Object()、工厂函数、字面量、构造函数、原型创建及混合模式。还讨论了原型对象、__proto__属性和constructor,以及call和apply在修改this指向上的应用。
摘要由CSDN通过智能技术生成

一、面向对象概念

面向过程(函数式):会把整个开发分为若干的步骤,一步一步的去开发完成功能。不理于多人协作开发
面向对象:会把一切的数据都看做对象
对象:
属性 变量 特点,特性 名词
方法 函数 功能 动词
实例:实例和对象之间的关系,人和你的关系。
类:es5中没有类(class) 类是对象的模板

面向对象特点:
继承 子类(派生类) 父类(基类,超类)
多态
封装

JavaScript也是一种面向对象的编程语言。

二、对象的创建

1.JavaScript内置对象:

Array Date Function Object String Boolean Number Math RegExp…

2.自定义对象

Object 对象 用户可以根据Object对象来创建自己所需要的个性化的对象

3.自定义对象的常见方法
1)new Object();//实例化
//创建一个人对象
var person=new Object();
person.name='王大锤';
person.age=30;
//添加方法
person.run=function(){
    console.log(this.name+" 跑的飞快.....");
};

person.say=function(){
    console.log(this.name+" 滔滔不绝");
};
person.run();
person.say();
2)工厂函数创建对象

上面的自定义对象,简单易懂好用,若要批量创建对象,则比较麻烦,所以,批量创建对象可以使用工厂函数

 //创建对象
    function createPerson(name, age) {
        var person = new Object();
        person.name = name;//person.name中name与=后的name没有任何关系。一个是属性一个变量
        person.age = age;
        //添加方法
        person.run = function () {
            console.log(this.name + " 跑的飞快.....");
        };

        person.say = function () {
            console.log(this.name + " 滔滔不绝");
        };
        return person;//返回创建的这个对象
    }

优点:可以批量创建对象
缺点:会为每一个对象都添加方法, 内存的浪费

3)字面量的形式创建对象(json)
var obj = {
    "name": "jack",
    age: 99,
    say: function () {
        console.log(this.name + "'哈哈哈'");
    },
    walk: function () {
        console.log(this.name + "走路.....");
    }
};

注意:不能大批量创建对象。属性名可以使用””包裹,也可以不使用(一般不用)

4)构造函数创建对象
   //构造函数
    function Student(name, age, no) {
        this.name = name;
        this.age = age;
        this.no = no;

        this.test = function () {
            console.log(this.name + "考试中.....");
        };
    }

构造函数特点:
A.构造函数的名称首字母需要大写(目的是为了与普通函数区分开)
B.构造函数中没有显示的创建对象(new Object())
C.将所有的属性和方法都赋值给了this
D.没有return语句,也没有返回对象
E.必须通过new运算符来调用

new运算符的功能:
A.创建一个新对象
B.会将构造函数的作用域赋给新对象(this就指向了这个新对象)
C.返回新对象

弊端: 依然会为每一个新对象创建新方法 内存浪费

5)原型来创建对象
function Student() { }

//将属性和方法都添加到原型中
Student.prototype.name = 'jack';
Student.prototype.say = function () {
    console.log(this.name + " 在说话.....");
};

优点:
弊端:无法通过传参来解决对象实例的个性化问题

6)混合模式创建对象(原型+构造函数)

在构造函数中完成属性的绑定
在原型中完成方法的添加

function Student(name,age,no){
        this.no=no;
        this.age=age;
        this.name=name;
    }

    //将方法添加到原型中
    Student.prototype.say=function(){
        console.log(this.name+" 在说话....");
    }

    Student.prototype.walk=function(){
        console.log(this.name+" 走路....");
    };

7)动态混合模式

三、原型对象

1.prototype
任何对象都有原型对象(prototype)
原型对象中内容,对对象实例来说都是公共的

打印对象的实例,发现对象实例有一个__proto__属性:

    console.log(Student.prototype==s1.__proto__);//true

对象实例的__proto__指向对象的原型。

2.constructor
原型对象有一个属性 constructor,该属性指向构造函数

四、call和apply

this在不同的地方指向不同的对象,通过call和apply方法可以修改this的指向,可以让它指向指定的对象。call和apply的功能一致

只有函数才可以调用call和apply
1)call
call(obj,item,item…)
参数说明:
obj: 修改之后this要指向的对象
后面的参数,就是传递给指定函数的参数

2)apply
apply(obj,数组);

obj:修改后this要指向的对象
数组参数:要传递给函数的参数

示例:修改this指向:

  function fn() {
        console.log(this);
    }
    // window.fn();
    var obj = {
        name: 'jack',
        age: 20
    };
    // obj.say();
    // fn.call(obj);//this  指向obj

上面代码中,原本普通调用时,函数中的this应该指向window,通过call改变了this的指向。如果函数是有参数的,则函数的第一个参数是this的指向,剩下的参数照常写。

示例:求数组的最大值

   var arr = [10, 20, 100, 5];

    // var m=Math.max(arr);
    var m = Math.max.apply(Math, arr);
    console.log(m);

示例:对象

function Person(name,age){
    // console.log(this);
    this.name=name;
    this.age=age;
}
function Student(name,age,no){
    // Person.call(this,name,age);//对象冒充
    Person.apply(this,[name,age]);
    this.no=no;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值