JavaScript面向对象:类、方法、属性

JavaScript是一种基于对象的语言,与传统的面向对象的语言(C#、C++)相比,JavaScript中没有类的概念,其继承有两种基本形式:基于对象的继承和基于类型的继承(原型链的继承)。无论哪种形式的继承,都是基于一个已经存在的对象创建一个新对象

类继承的实现

基于对象的继承

ES5中提供了一个Object.create()方法,可以简单的实现对象继承。在基于对象的继承中,一个对象继承另一个对象是不需要调用构造函数的。继承后的子类就拥有了父类的属性和方法,就如同将子类的原型设置为父类。

var Base = {
  name: 'wolf',
  sayName: function () {
    console.log(this.name)
  }
}

var sub = Object.create(Base)

sub.sayName() // wolf
sub.__proto__.sayName() // wolf

从上面的最后一行代码可以看出,子类实际上还是通过原型链访问父类中的属性和方法,对子类属性和方法的重写将切断对原型链上属性和方法的访问,但依然可以通过proto属性访问原型(父类)上的方法。

sub.sayName = function () {
  console.log('crassland_' + this.name)
}
sub.sayName() // crassland_wolf
sub.__proto__.sayName() // wolf

基于类型的继承

基于类型的继承是通过构造函数实现的,这种继承方式依赖于原型(prototype),相比于对象的继承,基于类型的继承更加灵活。每个函数对象都有一个prototype属性,通过这个属性可以将属性和方法写到对象的原型链上,实现对象的扩展和继承。

// 父类
var Base = function (name) {
  this.name = name
}

Base.prototype.sayName = function () {
  console.log(this.name)
}

// 子类
var Sub = function (name, age) {
  this.age = age
  this.name = name
}

Sub.prototype = new Base('wolf')

Sub.prototype.sayName = function () {
  console.log(this.name)
}

Sub.prototype.sayAge = function () {
  console.log(this.age)
}


var sub = new Sub('crassland_wolf', 22)

sub.sayName() // crassland_wolf
sub.__proto__.sayName() // wolf
sub.sayAge() // 22

属性和方法的可访问性

JavaScript中没有类的概念,但通过原型链可以实现继承和模拟出许多类似于传统面向对象的语言的特性。在类继承中,方法分为:

- 公有方法(原型方法)
- 私有方法
- 特权方法(原型方法)
- 静态方法

类的属性分为:

- 公有属性
- 私有属性
- 静态属性
- 原型属性

这些属性分别通过var、this、prototype实现,在使用上有所区别

this关键字
在JavaScript中,this对象是在运行时基于函数的执行环境决定的,总是指向当前执行函数的作用域。在没有明确的当前对象时(匿名函数),this指向全局对象,在浏览器中指向window对象。当函数被作为某个对象的方法调用时,this指向的是这个对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值