标签:struct 2.4 margin sign pad source 先来 失败 加载
var promise = new Promise(function(resolve,reject){// do somethingif (/* 操作成功 */) {resolve(value);} else {reject(err);}});
function imgloader () {return new Promise(function(resolve,reject){var img = new Image();img.src = ‘http://javascriptplayground.com/img/logo.png‘;img.onload = function(){resolve(img);};img.onerror = function(){reject(‘img load error‘);}})}

//定义类class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return ‘(‘ + this.x + ‘, ‘ + this.y + ‘)‘;}}
class Rectangle {constructor(height, width) {this.height = height;this.width = width;}}
var obj = new Myclass(); //报错class Myclass (){ }
{let B = class {}; // let 声明 不存在函数提升class A extends B { //如果存在类哈函数提升的话,这行会提升到第一行,父亲还没声明,儿子怎么继承?}}
class f1 {};class f1 {};var f2 = class {};class f2 {}; // 报错了class f3 {};var f3 = class {}; // 报错了var f4 = class {};var f4 = class {}; // 如果两个函数表达式重名了,那么不会报错
var myClass = class [className] [extends] {// class body}
// 方式一const MyClass = class {};// 方式二:给出类名const MyClass = class Me {getClassName() {return Me.name;}};
var Foo = class {constructor() {}bar() {return ‘Hello World!‘;}};var instance = new Foo();instance.bar(); // "Hello World!"Foo.name; // "Foo"
var Foo = class NamedFoo {constructor() {}whoIsThere() {return NamedFoo.name;}}var bar = new Foo();bar.whoIsThere(); // "NamedFoo"NamedFoo.name; // ReferenceError: NamedFoo is not definedFoo.name; // "NamedFoo"
let person = new class {constructor(name) {this.name = name;}sayName() {console.log(this.name);}}(‘Zhang San‘);person.sayName(); // Zhang San
constructor方法是一个特殊的类方法,仅在实例化的时候被调用。一个类只能拥有一个名为constructor的方法,否则会抛出SyntaxError异常。
如果没有定义constructor方法,这个方法会被默认添加,即,不管有没有显示定义,任何一个类都有constructor方法。
子类必须在constructor方法中调用super方法,否则新建实例时会报错。因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工,如果不调用super方法,子类就得不到this对象。
class Point {}class ColorPoint extends Point {constructor() {}}let cp = new ColorPoint(); // ReferenceError
ColorPoint继承了父类Point,但是它的构造函数没有调用super方法,导致新建实例时报错。定义类的方法时,方法名前面不需要加上function关键字。另外,方法之间不需要用逗号分隔,加了会报错。
class Bar {constructor() {}doStuff() {}toString() {}toValue() {}}
Bar.prototype = {doStuff() {},toString() {},toValue() {}};
prototype上面,所以类的新方法可以添加在prototype对象上面。Object.assign方法可以很方便地一次向类添加多个方法。
class Point {constructor() {// ...}}Object.assign(Point.prototype, {toString() {},toValue() {}});
class Point {constructor(x, y) {// ...}toString() {return ‘(‘ + x + ‘, ‘ + y + ‘)‘;}}Object.keys(Point.prototype); // []Object.getOwnPropertyNames(Point.prototype); // ["constructor", "toString"]Object.getOwnPropertyDescriptor(Point, ‘toString‘);// Object {writable: true, enumerable: false, configurable: true}
static关键字用来定义类的静态方法。静态方法是指那些不需要对类进行实例化,使用类名就可以直接访问的方法。静态方法经常用来作为工具函数。
class Point {constructor(x, y) {this.x = x;this.y = y;}static distance(a, b) {const dx = a.x - b.x;const dy = a.y - b.y;return Math.sqrt(dx*dx + dy*dy);}}const p1 = new Point(5, 5);const p2 = new Point(10, 10);console.log(Point.distance(p1, p2));
静态方法不可以被实例继承,是通过类名直接调用的。但是,父类的静态方法可以被子类继承。
class Foo {static classMethod() {return ‘hello‘;}}class Bar extends Foo {}Bar.classMethod(); // "hello"
extends关键字用于实现类之间的继承。子类继承父类,就继承了父类的所有属性和方法。 extends后面只可以跟一个父类。
class ColorPoint extends Point {constructor(x, y, color) {super(x, y); // 调用父类的constructor(x, y)this.color = color;}toString() {return this.color + ‘ ‘ + super.toString(); // 调用父类的toString()}}
extends关键字不能用于继承一个对象,如果你想继承自一个普通的对象,你必须使用 Object.setPrototypeof ( )
//先来个父类,带些属性function Super(){this.flag = true;}//为了提高复用性,方法绑定在父类原型属性上Super.prototype.getFlag = function(){return this.flag;}//来个子类function Sub(){this.subFlag = false;}//实现继承Sub.prototype = new Super;//给子类添加子类特有的方法,注意顺序要在继承之后Sub.prototype.getSubFlag = function(){return this.subFlag;}//构造实例var es5 = new Sub;
function Super(){this.flag = true;}Super.prototype.getFlag = function(){return this.flag; //继承方法}function Sub(){this.subFlag = flaseSuper.call(this) //继承属性}Sub.prototype = new Super;var obj = new Sub();Sub.prototype.constructor = Sub;Super.prototype.getSubFlag = function(){return this.flag;}
Sub.prototype.constructor = Sub;
function _inherits(subClass, superClass) {// 确保superClass为functionif (typeof superClass !== "function" && superClass !== null) {throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}// 把子类.prototype 继承了父类.prototype(new 父类), 同时把子类prototype的constructor进行了重写;// 给subClass添加constructor这个属性subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {value: subClass,enumerable: false,writable: true,configurable: true}});// 将父类设为子类的prototypeif (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;}
子类.prototype = new 父类
function Car (desc) {this.desc = desc;this.color = "red";}Car.prototype = {getInfo: function() {return ‘A ‘ + this.color + ‘ ‘ + this.desc + ‘.‘;}};//instantiate object using the constructor functionvar car = Object.create(Car.prototype);car.color = "blue";alert(car.getInfo()); //displays ‘A blue undefined.‘ ??! // 看见了吧,只会继承方法,不能继承属性
var Car2 = Object.create(null); //this is an empty object, like {}Car2.prototype = {getInfo: function() {return ‘A ‘ + this.color + ‘ ‘ + this.desc + ‘.‘;}};var car2 = Object.create(Car2.prototype, {//value propertiescolor: { writable: true, configurable:true, value: ‘red‘ },//concrete desc valuerawDesc: { writable: false, configurable:true, value: ‘Porsche boxter‘ },// data properties (assigned using getters and setters)desc: {configurable:true,get: function () { return this.rawDesc.toUpperCase(); },set: function (value) { this.rawDesc = value.toLowerCase(); }}});car2.color = ‘blue‘;alert(car2.getInfo()); //displays ‘A RED PORSCHE BOXTER.‘
class A extends B {}A.__proto__ === B; //继承属性A.prototype.__proto__ === B.prototype; //继承方法
子类.prototype = Object.create (父类.prototype) // 相当于 new 父类
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
super关键字可以用来调用其父类的构造器或方法。super 作为方法的时候,必须在 constructor 中调用,并且只能在 constructor 里面被调用
class Cat {constructor(name) {this.name = name;}speak() {console.log(this.name + ‘ makes a noise.‘);}}class Lion extends Cat {speak() {super.speak();console.log(this.name + ‘ roars.‘);}}
与ES5一样,在类内部可以使用get和set关键字,对某个属性设置取值和赋值方法。
class Foo {constructor() {}get prop() {return ‘getter‘;}set prop(val) {console.log(‘setter: ‘ + val);}}let foo = new Foo();foo.prop = 1;// setter: 1foo.prop;// "getter"
prop属性有对应 的赋值和取值方法,因此赋值和读取行为都被自定义了。
var descriptor = Object.getOwnPropertyDescriptor(Foo.prototype, ‘prop‘);"get" in descriptor // true"set" in descriptor // true
prop属性的描述对象上的,这与ES5一致。如果类的某个方法名前加上星号(*),就表示这个方法是一个Generator函数。
class Foo {constructor(...args) {this.args = args;}* [Symbol.iterator]() {for (let arg of this.args) {yield arg;}}}for (let x of new Foo(‘hello‘, ‘world‘)) {console.log(x);}// hello// world
for...of循环会自动调用这个遍历器。
更多
是大法官
标签:struct 2.4 margin sign pad source 先来 失败 加载
原文地址:http://www.cnblogs.com/dujuncheng/p/6907697.html