博客列表 >JavaScript遗漏的知识上

JavaScript遗漏的知识上

小菜鸟的博客
小菜鸟的博客原创
2021年01月18日 15:24:03554浏览

注意篇

定时器的匿名函数

虽然很方便, 建议用具名的, 因为维护好

  1. setTimeout(function goHome(){
  2. // 5s后跳转首页
  3. }, 5000)

技巧篇

自执行函数的偷懒命名

  1. ;(function(win, ngr, ltn, doc, $body) {
  2. })(window, navigator, location, document, document.body);

函数名提升比变量名优先级高

  1. foo()
  2. var foo;
  3. function foo(){
  4. alert(1)
  5. }

模块机制

  1. var modules = (function() {
  2. var names = {}
  3. return {
  4. define(name, deps, callback) {
  5. // 直接复用deps数组, 不用构建新的数组
  6. deps.forEach((item,i) =>{
  7. deps[i] = names[item]
  8. })
  9. names[name] = callback.apply(callback, deps)
  10. },
  11. get(name) {
  12. return names[name]
  13. }
  14. }
  15. })();
  16. modules.define('bar', [], function(bar){
  17. return {
  18. barHi(){
  19. alert('barHi');
  20. }
  21. }
  22. })
  23. modules.define('jquery', ['bar'], function(bar){
  24. return {
  25. hello(){
  26. alert('Hello');
  27. }
  28. }
  29. })
  30. console.log(modules.get('jquery'))

try/catch块级作用域

  1. try {
  2. throw 1
  3. } catch (a) {
  4. a = 'test';
  5. }
  6. // error
  7. console.log(a)

混入

  1. //显式
  2. var object = {
  3. name: 1
  4. }
  5. // 混入
  6. function mixin(src, target) {
  7. Object.keys(src).forEach(item => {
  8. // 不能覆盖target上的item
  9. if(!(item in target)) {
  10. target[item] = src[item]
  11. }
  12. })
  13. return target
  14. }
  15. console.log(mixin(object, {
  16. name: 22
  17. }));
  18. // 隐式混入
  19. var testObject1 = {
  20. name: 22,
  21. getName(){
  22. console.log(this.name);
  23. }
  24. }
  25. var testObject2 = {
  26. name: 333,
  27. getName(){
  28. testObject1.getName.call(this)
  29. }
  30. }
  31. testObject2.getName()

寄生继承

  1. function Vehicle() {
  2. this.name = 'test'
  3. }
  4. Vehicle.prototype.getName = function () {
  5. console.log(this.name);
  6. }
  7. function Dog() {
  8. // 重点内容
  9. var test = new Vehicle()
  10. var getName = test.getName
  11. test.getName = function () {
  12. getName.call(this)
  13. console.log('good ');
  14. }
  15. return test
  16. }
  17. Dog().getName()

维护代码继承

  1. // ES5
  2. function Button() {
  3. }
  4. Button.prototype.render = function () {
  5. console.log('Button');
  6. }
  7. function NewButton() {
  8. }
  9. NewButton.prototype = Object.create(Button.prototype)
  10. NewButton.prototype.render = function () {
  11. Button.prototype.render.call(this)
  12. console.log('New');
  13. }
  14. new NewButton().render()
  15. // ES6
  16. var Button = {
  17. init() {
  18. console.log('init');
  19. }
  20. }
  21. var Button2 = Object.create(Button)
  22. Button2.init = function () {
  23. Button.init.call(this)
  24. console.log('init2');
  25. }
  26. Button2.init()

语法篇

模块

  1. // js/bar.js
  2. export default {}
  3. // index.html
  4. <script type="module">
  5. // 用相对/绝对路径/远程
  6. import bar from './js/bar.js';
  7. </script>

迭代器

数组内置迭代器, 可以直接用for…of语法

鸡肋篇

Object.getOwnPropertyDescriptor(object, key)

获取对象上属性的描述符, 包含 value, writable, enumerable, configurable

Object.defineProperty(object, key, config)

加强版定义对象的属性和值
config属性包含 value, writable, enumerable, configurable

Object.preventExtensions(object)

禁止对象增加新的属性

Object.seal(object)

调用了preventExtensions, 然后把所有属性的configurable改为false

Object.freeze(object)

调用了 seal, 然后把所有属性的writable改为false

in 和 testObj.hasOwnProperty(key)

in会查找原型链
hasOwnProperty只会查找自己

getter setter

  1. function getter1() {
  2. var object = {}
  3. Object.defineProperty(object, 'dd', {
  4. get() {
  5. return 1
  6. },
  7. // 能被for...in 和 Object.keys(object)获取
  8. enumerable: true,
  9. })
  10. }
  11. function getter2(){
  12. var object = {
  13. name: 'test',
  14. get a(){
  15. return this.name;
  16. },
  17. set a(v){
  18. this.name = v
  19. }
  20. }
  21. }

原型检查

  1. /*
  2. 1. instanceof
  3. 2. isPrototypeOf
  4. 3. isRelatedTo()
  5. 4. Object.getPrototypeOf(object)
  6. 5. 兼容__proto__
  7. */
  8. function Test() {}
  9. function Foo() {}
  10. Foo.prototype = Object.create(Test.prototype)
  11. Foo.prototype.test = function () { }
  12. function Bar() {}
  13. Bar.prototype = Object.create(Foo.prototype)
  14. // 1. Bar对象的proto是否指向Foo.prototype
  15. new Bar() instanceof Foo
  16. // -----------------------
  17. // 3. 这个函数来确认Object.create的继承关系
  18. function isRelatedTo(o1, o2){
  19. function F(){}
  20. F.prototype = o2;
  21. return o1 instanceof F;
  22. }
  23. var bar = {
  24. name: 2
  25. };
  26. var newBar = Object.create(bar)
  27. var newBar2 = Object.create(newBar)
  28. console.log(isRelatedTo(newBar2, bar));
  29. // 2. isPrototypeOf
  30. // 内置的isRelatedTo
  31. bar.isPrototypeOf(newBar)
  32. // 4. 获取原型
  33. Object.getPrototypeOf(Foo)
  34. // 5. 兼容
  35. Object.defineProperty(Object.prototype, '__proto__',{
  36. get(){
  37. return Object.getPrototypeOf(this)
  38. },
  39. set(o){
  40. Object.setPrototypeOf(this, o)
  41. return o
  42. }
  43. })

Object.create

  1. // 兼容
  2. Object._create = function(obj){
  3. function F(){}
  4. F.prototype = obj
  5. return new F()
  6. }
  7. // 参数2是配置对象的属性
  8. Object.create(a,{
  9. name:{
  10. enumerable: false
  11. }
  12. })
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议