JS 中 __proto__ 和 prototype 存在的意义是什么?
JS 的 new 到底是干什么的?
从本地读取时间。尤其注意月份范围是 0~11。
var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015
now.getMonth(); // 5
now.getDate();
now.getDay();
now.getHours(); // 19, 24小时制
now.getMinutes();
now.getSeconds();
now.getMilliseconds(); // 875, 毫秒数
now.getTime(); // 1435146562875, 以number形式表示的时间戳
var d = new Date(2015, 5, 19, 20, 15, 30, 123);
d = Date.parse('2015-06-24T19:49:22.875+08:00'); // ISO 8601格式的字符串
// 返回一个整数表示时间戳
d = new Date(Date.parse('2015-06-24T19:49:22.875+08:00')); // 转换一下
再次注意使用 Date.parse()
时传入的字符串使用实际月份 01~12,转换为 Date
对象后 getMonth()
获取的月份值为 0~11。
时间戳是从1970年1月1日零时整的GMT时区开始到现在的毫秒数。
挖坑。
了解更多JSON对象信息
每个 JSON 对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或更多的值。
JSON 对值的类型和格式有严格的规定:
null
(不能使用 NaN
, Infinity
, Infinity
和 undefined
)。很多时候,我们需要用 JSON.stringify(zrd, foo, ' ')
把 JS 对象序列化为 JSON 格式是字符串。其中 foo 可以是一个数组,表示想输出的指定属性。或者也可以是一个函数,这样每个键值都会被处理:
function foo(key, value) {
if (typeof(value) === 'string') {
return value.toUpperCase(); // 键值变成大写
}
return value; // 莫忘记return value
}
如果我们还想要精确控制如何序列化小达达,可以给 zrd
定义一个 toJSON()
的方法,返回 JSON 应该序列化的数据:
var zrd = {
name: 'super da da',
gender: 'male',
toJSON: function () {
return {
mingzi: this.name, // 可以更改属性名字和键值
xingbie: this.gender,
add: 111
};
}
};
或者,我们需要用 JSON.parse(s, foo)
把 JSON 格式的字符串反序列化为一个 JS 对象。其中 foo
是一个函数,用来转换解析出的属性:
function foo(key, value) {
if (key === 'gender') {
return 'female';
}
return value;
}
和 JAVA,C++ 不同,JS 的面向对象不区分类和实例,而是通过原型(prototype)来实现面线对象编程。
JS 对每个创建的对象都会设置一个原型,指向它的原型对象。这样做的好处是可以多个对象实例共享某些方法,从而节省空间。
我们可以用构造函数(constructor)来生成一个对象:
function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.eat = function () {
return 'mouse'; // Cat.prototype的所有属性和方法都会被Cat构造的实例继承
}
var cat1 = new Cat('kiki', 'yellow');
var cat2 = new Cat('wiwi', 'red');
cat1.constructor === Cat; // true
console.log(cat1 instanceof Cat); // true
cat1.eat === cat2.eat; // true
Cat.prototype.isPrototypeOf(cat1); //true
cat1.hasOwnProperty('eat'); //false