JavaScript(03)面向对象

本文深入探讨JavaScript中的面向对象编程,从简单的面向对象实现到构造函数、原型继承、类继承,以及最佳实践。详细解析了原型链、构造函数的使用、方法和操作符,提出JS对象创建的最佳模式。同时,讨论了ES6的class语法,以及通过JSON和实际案例(如屏幕拖拽)来理解面向对象的运用。
摘要由CSDN通过智能技术生成

创建对象

一、js中的面向对象

  • 其他语言中(如java)是依靠类和实例这两个人概念来实现面向对象的编程的
  • JavaScript不区分类和实例的概念,而是通过原型prototype来实现面向对象编程
  • java 本质是通过类模版来创建不同的实例对象,而js中一切皆对象,是通过对象来创建对象
简单面向对象的实现
// 原型对象:
var Student = {
   
    name: 'Robot',
    height: 1.2,
    run: function () {
   
        console.log(this.name + ' is running...');
    }
};

function createStudent(name) {
   
    // 基于Student原型创建一个新对象:
    var s = Object.create(Student);
    // 初始化新对象:
    s.name = name;
    return s;
}

var xiaoming = createStudent('小明');
xiaoming.run(); // 小明 is running...
xiaoming.__proto__ === Student; // true

二、使用构造函数创建对象

1、构造函数

  • 构造函数就是一个普通的函数,不过使用的方法比较特殊
  • 不写new就是一个普通函数,它返回undefined
  • 写了new就变成了一个构造函数,它绑定的this指向新创建的对象,并默认返回this
function Student(name) {
   
    this.name = name;
    this.hello = function () {
   
        alert('Hello, ' + this.name + '!');
    }
}

var xiaoming = new Student('小明');
xiaoming.name; // '小明'
xiaoming.hello(); // Hello, 小明!

2、prototype & constructor

  • 创建一个函数A,浏览器就会在内存中对应创建一个对象B,函数A的 prototype 属性指向对象B
  • 这个对象B就是函数A的原型对象,简称函数的原型
  • 这个原型对象B 默认会有一个属性 constructor 指向了这个函数A
  • 可以为函数的 prototype 属性指定新的对象来作为原型,这样做的问题就是新对象的constructor属性则不再指向该构造函数了

3、__proto__

  • 通过构造函数创建的对象没有prototype这个属性,不过可以用__proto__这个非标准用法来查看构造函数的原型对象
    在这里插入图片描述
hasOwnProperty方法和in操作符
  • hasOwnProperty判断属性是不是对象特有的,属性不存在或者存在于原型链中都会返回false
  • in 操作符只要属性存在,无论是对象特有还是原型链中的都返回true
  • 存在于原型中的属性判断:in 返回true,hasOwnProperty返回false

4、JS对象创建的最佳实践

  • 构造函数加属性(特有),原型(prototype)加方法(共有);
function CreatePerson(name, qq)        //构造函数
{
   
    this.name=name;
    this.qq=qq;
}

CreatePerson.prototype.showName=function ()    //原型
{
   
    alert('我的名字叫:'+this.name);
};

CreatePerson.prototype.showQQ=function ()
{
   
    alert('我的QQ号:'+this.qq);
};

var obj=new CreatePerson('blue', '258248832');
var obj2=new CreatePerson('张三', '45648979879');
  • 上诉代码的缺陷在于方法和属性还是分离的,封装性还不够好,可以使用如下代码改进
  • 改进代码的特点就是第一次通过构造函数创建对象的时候会自动通过原型添加方法
function CreatePerson(name, qq)        //构造函数
{
   
    this.name
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值