公有属性和方法
公有方法必须通过实例化调用;
公有方法中不能使用this调用静态方法 属性,必须构造函数(对象)本身调用;
公有方法不能调用私有属性方法(调用即是特权方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function User (name, age) { this.name = name this.age = age } User.prototype.getName = function () { return this.name }
const obj = { name: 'gss', getName: function () { return this.name } getName () {} }
|
私有属性和方法
对象的私有方法和属性,外部是不可以访问的;
在方法的内部不是能this调用对象的公有方法、公有属性、特权方法的。
在对象中创建私有数据的方式被称为模块模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| function User (name, age, sex) { this.sex = sex const myName = name const myAge = age function getName () { return myName } function getSex () { console.log(this) console.log(this.sex) } this.activeGetSex = function () { getSex() } } let u = new User('g',11,'man') u.activeGetSex()
const obj = (function () { const a = 1 return { b: 2, getB(){ console.log(this.b) }, getA(){ console.log(a) } } })()
|
特权方法
可以访问私有属性和方法的公有方法;
特权方法通过this调用公有方法、公有属性;
在方法体内直接调用私有属性和私有方法。
特权方法能够在构造函数外面公开访问(仅限于实例化的对象),而且还能够访问私有成员和方法,因此用来做为对象或者构造函数的接口最合适不过了,通过特权方法我们可以控制公有方法对私有属性或方法的访问。 在Js框架的扩展中有很多应用。
特权方法和公有方法的区别
相同点: 都能访问公有属性,都能在构造函数外公开访问
不同点: 特权方法能访问私有属性和方法,公有方法不能;每个实例都有一份特权方法的副本,公有方法为所有实例共享(在原型上;)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| function User (name, age) { this.age = age var name = name this.getName = function () { console.log(name) return name } this.alertAge = function () { alert(this.getAge()) } } User.prototype.getAge = function () { return this.age }
const Obj = (function () { let _num = 1 const _addNum = function (base) { _num += base console.log(_num) } function Foo (baseNum=0) { this.baseNum = baseNum this.getNum = function () { console.log(_num) return _num } } Foo.prototype.getBaseNum = function () { console.log(this.baseNum) return this.baseNum } Foo.prototype.addNum = function () { _addNum(this.baseNum) } return Foo })() const o = new Obj(10) o.getBaseNum() o.getNum() o.addNum() o.getNum()
|
静态属性和方法
js中无需实例化就可调用的属性和方法;
实例不能调用静态方法属性;
静态方法无法调用公有属性、公有方法、私有方法、私有属性、特权方法和原型属性
1 2 3 4 5 6
| function User () {} User.myName = 'victor' User.getName = function () { return this.myName } User.getName()
|
静态类
静态属性和方法不用上述构造函数的形式,可以直接用字面量的形式创建对象
1 2 3 4 5 6 7 8 9 10 11 12
| const User = { init: function (name, age) { this.name = name this.age = age }, getName() { return this.name } } User.init('gss', 18) User.getName() User.name
|