var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function() { return this.name; };
}
};
console.log(object.getNameFunc()());
var dog = new Animal()
console.log(dog.getNotPublicProperty()); // 2
console.log(dog._notPublicMethod()); // ReferenceError: _notPublicProperty is not defined
JavasScript 的闭包的原理,分析。都已经很多了。
相关的知识点有:
闭包,作用域,作用域链 也会一起参与的有:
原型,原型链,event loop
来两道题热热身
闭包相关的应用与周边
函数式编程
函数式编程是个很大的话题。这里略过。 常见的库都能和函数式不多不少扯上点边: lodash, jQuery, react, rxjs
装饰器 ( Decorator )
写
react
应用会经常用到数据流的库,例如react-redux
和mobx-react
就跟这能扯上关系了。至今,
Babel7
已经出了自家的 Decorators 的实现。7.1.0 Released: Decorators, Private Static Fields当然,TypeScript 之前也有它的装饰器实现,未来理论上是会向社区靠拢。
串联知识点
Decorator
( 该语法特征与使用场景 )Object.defineProperty
( 社区很多 Vue 的分析与 mini 库 )Proxy
( Vue 3.0 使用了 Proxy 作为底层的方案,为什么这么选型。以及选型前后的优缺 )JavaScript 实现 Private 的几种方案
社区的
#
标识符提案Babel7
实现了private instance methods
7.2.0 Released: Private Instance Methods基于约定。例如:
_
为开头Typescript 的 public, private, and protected ts 的 private 看似没有做有效的操作。应该是为了编译期进行校验操作。
直接放文档:
Typescript - Classes Typescript - 代码编译前后对比
Animal.prototype = (function () { var self = this; var _notPublicProperty = 2; function _notPublicMethod() { return _notPublicProperty; }
return { constructor: Animal, getNotPublicProperty: function() { return _notPublicMethod.call(this) } } }())
var dog = new Animal() console.log(dog.getNotPublicProperty()); // 2 console.log(dog._notPublicMethod()); // ReferenceError: _notPublicProperty is not defined
const _notPublicMethod = Symbol() const _notPublicProperty = Symbol() class Animal { constructor() { this[_notPublicProperty] = 2; } [_notPublicMethod]() { return this[_notPublicProperty]; // 必须用中括号 } getNotPublicProperty() { return this[_notPublicMethod]() } }
var dog = new Animal()
console.log(dog.getNotPublicProperty()); // 2 console.log(dog._notPublicMethod()); // ReferenceError: _notPublicProperty is not defined
const store = new WeakMap()
class Animal { constructor() { var self = this;
}
getNotPublicProperty() { return store.get(this)._notPublicMethod } }
var dog = new Animal()
console.log(dog.getNotPublicProperty()); // 2 console.log(dog._notPublicMethod()); // ReferenceError: _notPublicProperty is not defined