标签:struct 2.4 margin sign pad source 先来 失败 加载
var promise = new Promise(function(resolve,reject){
// do something
if (/* 操作成功 */) {
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 defined
Foo.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 = flase
Super.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为function
if (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
}
});
// 将父类设为子类的prototype
if (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 function
var 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 properties
color: { writable: true, configurable:true, value: ‘red‘ },
//concrete desc value
rawDesc: { 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: 1
foo.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