生活随笔
收集整理的這篇文章主要介紹了
ES6-17 class与对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
class
類內部的方法是不可枚舉的
ES5用Object.assign拓展的原型屬性是可枚舉的
function Point ( x, y ) { this . x
= x
; this . y
= y
;
}
Point . prototype
= Object
. assign ( Point . prototype
, { eat : function ( ) { } , drink : function ( ) { } ,
} )
class Point { constructor ( x, y ) { this . x
= x
; this . y
= y
; } toString ( ) { return '(' + this . x
+ ', ' + this . y
+ ')' ; }
}
const p
= new Point ( 1 , 1 )
console
. log ( p
)
console
. log ( p
. toString ( ) )
默認指定constructor
class Point { }
const p
= new Point ( )
console
. log ( p
)
class Foo { constructor ( ) { return Object
. create ( null ) ; }
} new Foo ( ) instanceof Foo
表達式寫法和IIFE
let Point
= class { }
const p
= new Point ( )
console
. log ( p
) let person
= new class Person
{ } ( )
console
. log ( person
)
let person
= new class Person
{ constructor ( name, age ) { this . name
= name
; this . age
= age
; }
} ( 'Lee' , 10 )
console
. log ( person
)
存在TDZ 不可提升
ES7私有屬性新寫法
class Point { x
= 1 ; y
= 1 ; toString ( ) { return '(' + this . x
+ ', ' + this . y
+ ')' ; }
}
console
. log ( new Point ( ) . toString ( ) )
公有屬性的私有方法
Symbol
const _print
= Symbol ( )
console
. log ( _print
)
class Point { x
= 1 ; y
= 1 ; toString ( ) { return '(' + this . x
+ ', ' + this . y
+ ')' ; } [ _print
] ( ) { console
. log ( '公有屬性私有化' ) }
}
console
. log ( new Point ( ) . toString ( ) )
new Point ( ) [ _print
] ( )
console
. log ( new Point ( ) )
將方法定義到class外部
class Point { x
= 1 ; y
= 1 ; print ( ) { _print . call ( this , this . x
, this . y
) ; } }
function _print ( x, y ) { console
. log ( this . x
, this . y
)
}
new Point ( ) . print ( )
console
. log ( new Point ( ) )
static靜態方法
類中定義取值、存值函數
class Point { get a ( ) { console
. log ( '取值函數' ) } set b ( val ) { console
. log ( '存值函數' , val
) }
}
const p
= new Point ( )
p
. a
p
. b
= 10
類中默認使用了嚴格模式
繼承extends
name為什么為什么不報錯
super
let proto
= { y
: 20 , z
: 40
}
let obj
= { x
: 10 , foo ( ) { console
. log ( super . y
) }
}
Object
. setPrototypeOf ( obj
, proto
)
obj
. foo ( )
轉譯ES5
Object
. keys ( Object . prototype
)
TDZ use strict 不可枚舉 只能通過new方式調用 不傳參數不會報錯
class Person { constructor ( name
= 'Lee' , age
= "18" ) { this . name
= name
; this . age
= age
; } say ( ) { console
. log ( 'say' ) } drink ( ) { console
. log ( 'drink' ) } static eat ( ) { console
. log ( 'static eat' ) }
}
"use strict" ;
function _classCallCheck ( instance, Constructor ) { if ( ! ( instance
instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; }
} function _defineProperties ( target, props ) { for ( var i
= 0 ; i
< props
. length
; i
++ ) { var descriptor
= props
[ i
] ; descriptor
. enumerable
= descriptor
. enumerable
|| false ; descriptor
. configurable
= true ; if ( "value" in descriptor
) descriptor
. writable
= true ; Object
. defineProperty ( target
, descriptor
. key
, descriptor
) ; }
}
function _createClass ( Constructor, protoProps, staticProps ) { if ( protoProps
) _defineProperties ( Constructor . prototype
, protoProps
) ; if ( staticProps
) _defineProperties ( Constructor
, staticProps
) ; return Constructor
;
}
var Person
= function ( ) { function Person ( ) { var name
= arguments
. length
> 0 && arguments
[ 0 ] !== undefined ? arguments
[ 0 ] : 'Lee' ; var age
= arguments
. length
> 1 && arguments
[ 1 ] !== undefined ? arguments
[ 1 ] : "18" ; _classCallCheck ( this , Person
) ; this . name
= name
; this . age
= age
; } _createClass ( Person
, [ { key
: "say" , value : function say ( ) { console
. log ( 'say' ) ; } } , { key
: "drink" , value : function drink ( ) { console
. log ( 'drink' ) ; } } ] , [ { key
: "eat" , value : function eat ( ) { console
. log ( 'static eat' ) ; } } ] ) ; return Person
;
} ( ) ;
裝飾器
npm install -D @babel/plugin-proposal-decorators 淘寶npm鏡像pm i babel-plugin-transform-decorators-legacy --save-dev --registry=https://registry.npm.taobao.org 配置babelrc 沒安裝前,在瀏覽器運行代碼報錯Uncaught SyntaxError: Invalid or unexpected token npx babel app.js --watch --out-file bundle/app.js 實時監聽
{ "presets" : [ "@babel/preset-env" ] , "plugins" : [ [ "@babel/plugin-proposal-decorators" , { "legacy" : true } ] ]
}
@testable
class Person { constructor ( name
= 'Lee' , age
= "18" ) { this . name
= name
; this . age
= age
; } say ( ) { console
. log ( 'say' ) } drink ( ) { console
. log ( 'drink' ) } }
let person
= new Person ( )
console
. log ( 'person' , person
)
function testable ( target ) { console
. log ( 'testable' , target
)
}
安裝插件后打包,在index.html中引入打包后的文件,瀏覽器打印出正確結果
@testable
class Person { constructor ( name
= 'Lee' , age
= "18" ) { this . name
= name
; this . age
= age
; } @readOnly
say ( ) { console
. log ( 'say hi' ) }
}
let person
= new Person ( )
person
. say ( )
function testable ( target ) { console
. log ( 'testable' , target
)
}
function readOnly ( target, name, descriptor ) {
console
. log ( 'readOnly' , target
, name
, descriptor
)
}
使用場景 - 埋點
class AD { @
log ( 'show' ) show ( ) { console
. log ( 'ad is show' ) } @
log ( 'click' ) click ( ) { console
. log ( 'ad is click' ) }
}
let ad
= new AD ( )
ad
. show ( )
function log ( type ) { return function ( target, name, descriptor ) { let src_fn
= descriptor
. value
; descriptor
. value = ( ... args) => { src_fn . apply ( target
, args
) ; console
. log ( '埋點' , type
) } }
}
總結
以上是生活随笔 為你收集整理的ES6-17 class与对象 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。