Skip to content

Commit 0f0c366

Browse files
committed
面向对象学习
1 parent 343a494 commit 0f0c366

File tree

10 files changed

+627
-0
lines changed

10 files changed

+627
-0
lines changed

6.Object/1.createObject.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* 使用对象对象直接量,创建对象
3+
*/
4+
var empty = {}; // 没有任何属性的对象
5+
var point = { x:0, y:0 }; // 两个属性
6+
var point2 = { x: point.x, y : point.y } // 更复杂的值
7+
var book = {
8+
"main titel" : "Javacript ", // 属性里有空格,必须用字符串表示
9+
'sub-ttile' : "The definitve Guide", // 属性名称里有连字符、必须用字符串表示
10+
'for' : "all audiences", // "for"是保留字,因此必须用引号
11+
author : { // 这个属性的值是一个对象
12+
firstname : "Davide", // 注意这个属性名都没有引号
13+
surname: "Flanagan"
14+
}
15+
}
16+
17+
/**
18+
* 通过new创建对象
19+
*/
20+
var o = new Object(); // 创建一个空对象,和{}一样
21+
var a = new Array(); // 创建一个空数组,和[]一样
22+
var d = new Date(); // 创建一个表示当前时间的Date对象
23+
var r = new RegExp("js"); // 创建一个可以进行模式
24+
25+
26+
/**
27+
* Object.create() 创建对象
28+
*/
29+
var o1 = Object.create( {x:1,y:2} ); // o1继承了属性x和y
30+
var o2 = Object.create(null); // 02不继承任何属性和方法 toString()方法也不继承
31+
var o2 = Object.create(Object.prototype); // 03和{} 和new Object()一样都继承自Object
32+
33+
34+
/**
35+
* 通过原型继承创建一个新对象
36+
* inherit()返回一个继承自原型对象p的属性的新对象
37+
* 这里使用ECMAScript 5中的Object.reate()函数(如果存在的话)
38+
* 如果不存在Object.crate()。则退化使用其他方法
39+
* @param p
40+
*/
41+
function inherit(p){
42+
if( p == null ) throw TypeError(); // p是一个对象,但是不能是null;
43+
if(Object.create){ // 如果Object.create()存在
44+
return Object.create(p); // 直接使用它
45+
}
46+
var t = typeof p; // 否则进一步检测
47+
if( t !== "object" && t!== "function" ) throw TypeError();
48+
49+
function f(){}; // 定义空的构造函数
50+
f.prototype = p; // 将其原型设置为p
51+
return new f(); // 使用f()创建继承对象
52+
}
53+
54+
var o = { x : "don't change this value" }
55+
libary_function(inherit(o)); // 防止对0的意外修改
56+
57+
58+
59+
60+
61+
62+
63+

6.Object/2.Object.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Created by Think on 2016/7/3.
3+
*/
4+
5+
/**
6+
* 面向对象编程
7+
* @param name
8+
* @param age
9+
*/
10+
function person(name,age){
11+
this.name = name;
12+
this.age = age;
13+
}
14+
15+
16+
/*
17+
function r(t) {
18+
return t.toLowerCase().replace(/[xy]/g, function (t) {
19+
var n = 16 * Math.random() | 0, r = "x" == t ? n : 3 & n | 8;
20+
return r.toString(16)
21+
}).toUpperCase()
22+
}
23+
24+
console.log( r("xxx"));*/
25+
26+
/**
27+
* 枚举n对象的属性,如果n对象中的属性为自有属性(非继承),将属性定义为t的原型。
28+
* @param t t
29+
* @param n
30+
*/
31+
function n(t, n) {
32+
var r;
33+
//for (r in n)n.hasOwnProperty(r) && (t.prototype[r] = n[r])
34+
35+
for (r in n){
36+
n.hasOwnProperty(r);
37+
(t.prototype[r] = n[r]);
38+
}
39+
40+
}
41+
42+
var a = { a:5};
43+
var b = { b:15};
44+
n(a,b);
45+
//console.log(a.b);
46+

6.Object/3.delete.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* Created by Think on 2016/7/16.
3+
*/
4+
5+
//
6+
var book = {
7+
name : 'Javascript ',
8+
author : 'nick'
9+
}
10+
11+
delete book["name"];
12+
13+
for(var prop in book){
14+
console.log( prop );
15+
}
16+
17+
// 当delete表达式删除成功或没有任何副作用时,总是返回true。
18+
var o = {x:1}; // o有一个属性x,并继承属性toString
19+
delete o.x; // 删除x,返回true
20+
delete o.x; // 什么都没有做(x已经不存在),返回true
21+
delete o.toString; // 什么都没有做,(不能删除继承属性)
22+
delete 1; // 无意义 返回true;
23+
24+
// delete不能删除那些可配置性为false的属性(尽管可以通过删除不可扩展对象的属性)
25+
// ,某些属性是不可配置的,这些情况下会返回false;
26+
delete Object.prototype; // 不能删除,属性是不可配置的
27+
var x = 1; // 申明一个全局变量
28+
delete this.x; // 不能删除这个属性
29+
function f(){}; // 声明一个全局函数
30+
delete this.f; // 不能删除全局函数
31+
32+
33+
var v = {
34+
"id" : ['studentid','type']
35+
}

6.Object/4.checkProperty.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Created by Think on 2016/7/5.
3+
*/
4+
5+
// in运算符的检测对象的属性 (自有属性,继承而来的返回true)
6+
var o = {x : 1};
7+
o.y = 5;
8+
console.log( "---------in----------"); // false
9+
console.log( "x" in o); // true
10+
console.log( "y" in o); // false
11+
console.log( "toString" in o); // true toString属性是继承而来
12+
13+
14+
// 对象的hasOwnProperty()方法来检查给定名字是否为对象的自有属性,对于继承属性将返回false;
15+
console.log( "---------hasOwnProperty----------");
16+
console.log( o.hasOwnProperty("x") ); // true
17+
console.log( o.hasOwnProperty("y") ); // false
18+
console.log( o.hasOwnProperty("toString")); // false toString属性是继承而来,返false
19+
20+
21+
// propertyIsEnumerable()是hasOwnProperty的增强版本,
22+
// 只有监测是只有属性而且这个属性是可以枚举( enumerable atrribute)为true时它才返回ture。
23+
console.log( "---------propertyIsEnumerable----------");
24+
var o = {y: 2};
25+
o.x = 1;
26+
console.log(o.propertyIsEnumerable("toString")); // 继承为属性-》不可枚举
27+
console.log(o.propertyIsEnumerable("x")); // 定义的实例变量可枚举
28+
console.log(o.propertyIsEnumerable("y")); // 定义的静态变量可枚举
29+
30+
31+
// “!==”判断一个属性是否undefined,来检查对象属性
32+
var o = {y: 2};
33+
console.log( "---------propertyIsEnumerable----------");
34+
console.log(o.y !== undefined ); // true 有属性
35+
console.log(o.z !== undefined ); // false 无此属性
36+
console.log(o.y); // false 无此属性
37+
38+
39+
// 注意:上述代码中使用的是"!=="运算符,而不是"!=". "!=="可以区分undefined和null
40+
// 有时不必须区分
41+
// 如果o中含有属性x,且x的值不是null或者undefinned,0.x乘以2
42+
if(o.x != undefined ) o.x *= 2;
43+
// 如果o中含有属性x,且x的值不能转换为false,o.x乘以2
44+
// 如果x是undefined,null,false," ",0或NaN,则它保持不变
45+
if(o.x) o.x *=2;
46+

6.Object/5.enmerable.js

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/**
2+
* 枚举属性 by Think on 2016/7/13.
3+
*/
4+
5+
/**
6+
* for/循环可以在循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性),
7+
* 把属性名称赋值给循环变量。对对象继承的方法不可枚举,但是在代码中给对象添加的属性是可以枚举。
8+
* @type {{x: number, y: number, z: number}}
9+
*/
10+
var o = { x: 1, y :2, z: 3}; // 三个可枚举的自有属性
11+
console.log(o.propertyIsEnumerable("toString")); // =>false ,不可枚举
12+
for(var p in o)
13+
console.log(p) // 输出x、y和z
14+
15+
/**
16+
* 对对象的属性(非自有属性)过滤,常见两种方式:
17+
*/
18+
19+
// 方式一:
20+
for(p in o){
21+
if(!o.hasOwnProperty(p)) continue; // 跳过继承属性
22+
console.log("方式一:",p);
23+
}
24+
25+
for(p in o){
26+
if( typeof o[p] === 'funciton' ) continue; // 跳过函数方法
27+
console.log("方式二:",p);
28+
}
29+
30+
31+
// 用来枚举属性的对象工具函数
32+
33+
/**
34+
* 把p中的可枚举属性复制到o中,并返回o
35+
* 把o和p中含有同名属性,并覆盖ozho
36+
* 备注:不能解决IE中的bug
37+
* @param o
38+
* @param p
39+
*/
40+
function extend(o,p){
41+
for (var prop in p){ // 遍历p中的所有属性
42+
o[prop] = p[prop]; // 遍历属性添加至o中
43+
}
44+
return o;
45+
}
46+
47+
/**
48+
* 将p中的可枚举属性复制到o中,并返回o
49+
* 如果o和p中同名的属性,o中的属性将不受影响
50+
* 这个函数并不处理setter和getter以及复制属性
51+
* @param o
52+
* @param p
53+
*/
54+
function merge(o,p){
55+
for(prop in p ){ // 遍历p中所有属性
56+
if(p.hasOwnProperty(prop)) continue; // 过滤已经在o中存在的属性
57+
o[prop] = p[prop]; // 将属性添加至0中
58+
}
59+
return o;
60+
}
61+
62+
/**
63+
* 如果o中的属性没有在p中没有同名的属性,则从o中删除这个属性
64+
* @param o
65+
* @param p
66+
* @returns {*}
67+
*/
68+
function restrict(o,p) { //限制
69+
for(prop in o) { // 遍历o中的所有的属性
70+
if(! (prop in p)) delete o[prop]; // 如果在p中不存在,则删除
71+
}
72+
return o;
73+
}
74+
75+
/**
76+
* 如果o中的属性在p中存在同名的属性,则从o中删除这个属性
77+
* return 0
78+
*/
79+
function subtract(o,p) { // 减去
80+
for(prop in p){ // 遍历p中的所有属性
81+
delete o[prop]; // 从o中删除(删除一个不存在的属性不会报错)
82+
}
83+
return 0;
84+
}
85+
86+
/**
87+
* 返回一个新对象,这个对象同时拥有o的属性和p的属性
88+
* 如果o和p有重名属性,使用p中的属性值
89+
* @param o
90+
* @param p
91+
* @returns {*}
92+
*/
93+
function union(o,p){
94+
return extend(extend({},o),p);
95+
}
96+
97+
/**
98+
* 返回一个新对象,这个对象拥有同时o和的出现的属性
99+
* 像求o和p的交集,但是p中的属性值忽略
100+
*/
101+
function intersection(o,p){
102+
return restrict(extend({},o),p);
103+
}
104+
105+
/**
106+
* 返回一个数组,这个数组包含是的o中可枚举的自有属性的名称
107+
* @param o
108+
* @returns {Array}
109+
*/
110+
function keys(o){
111+
if (typeof o !== "object" ) throw TypeError(); // 参数必须是对象
112+
var result = []; // 属性数组
113+
for( var prop in o ){
114+
if(o.hasOwnProperty(prop)) result.push(prop);
115+
}
116+
return result;
117+
}
118+
119+
// ECMAScript5定义了两个个用以枚举属性名称的函数
120+
// 第一个:Object.keys( o );
121+
// 第二个:Object.getOwnPropertyNames( o );
122+
console.log("Object keys:", Object.keys(o));
123+
console.log("Object keys:", Object.getOwnPropertyNames(o));
124+
125+
126+
127+
128+
129+
130+

0 commit comments

Comments
 (0)