1. 程式人生 > >JS - 面向物件

JS - 面向物件

目錄

1、屬性與方法(增刪改查)

2、類字典:不存在字典的概念,卻模擬字典的實現

3、建構函式(ES5):實現多個相似類的創造

4、繼承(ES5)(存在知識點模糊???)

- 組合繼承(構造繼承屬性,原型繼承方法)

5、類及繼承(ES6)


1、屬性與方法(增刪改查)

注意:

  • 屬性的建立有兩種方式,但是想要支援 “-” 語法 必須使用 [“”] 
    例如:abc-123 必須使用 [“abc-123”] 進行創造和訪問。
  • 出現的訪問有兩種方式,除非存在 -,可以互相任意使用
    例如:obj.a = 123  ===>>> obj.a 、obj["a"]
//建立物件的兩種方式
var obj = {}; 
var obj = new Object();

//物件的屬性,兩種方式
obj.prop = "";
obj["age-0"] = 15

// 物件的方法
obj.func = function () {……}


// 物件屬性和方法的訪問方式
obj.prop
obj.func()
obj["age-0"]

// 物件屬性和方法的修改
obj.prop = "new"

// 屬性與方法刪除
delete obj.prop
delete obj.func
<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<title>面向物件初始</title>
</head>
<body>
</body>
<script type="text/javascript">
	// 建立一個空物件
	var obj = {}
	// 對空物件進行新增屬性
	obj.name = "大毛";21
	obj["age"] = 18;
	
	// 列印物件
	console.log(obj);

	// 使用屬性
	console.log(obj["name"]);
	console.log(obj.age);
	console.log(obj["age"]);

	// 對物件新增方法
	obj.eat = function () {
		console.log("吃吃吃!!!");
	}
	// 方法的使用
	obj.eat();

	// 屬性|方法的移除
	delete obj.name

	console.log(obj);

</script>
</html>

 

2、類字典:不存在字典的概念,卻模擬字典的實現

 總結:

  1.     key全為字串形式,存在兩種書寫方式, name || “name”
  2.     當key為js識別符號不支援的語法情況下,必須新增引號。例如:字串中存在 -,“abc-123”
  3.     value可以為任意型別
  4.     值存在兩種訪問方式:字典名.key || 字典名["key"] ; 注意“.”的使用
  5.     可以隨意新增 key:value的鍵值對 完成增刪改查
//dict.name | dict["my-name"] | dict.fn()

var dict = {
	key1: "value1",
	key2: 18,
	"my-key3": [1, 2, 3, 4, 5]
}
var dict_1 = {
    "my-name": "zero", 
    fn: function () {}, 
    fun () {}
}

// 增
dict.key4 = true;
console.log(dict);

// 刪
delete dict.key4;
console.log(dict);

// 改
dict["my-key3"] = [5, 4, 3, 2, 1];
console.log(dict);

// 查
console.log(dict.key1);
console.log(dict["key1"]);

 

3、建構函式(ES5):實現多個相似類的創造

注意:

  • 建構函式,命名通常採用首字母大寫的大駝峰寫法
  • 內部構建屬性和方法的時候,使用this關鍵詞
  • 建構函式可以建立多個例項物件,但通過{}普通構造出來的物件是唯一的。例如: var obj = {}
//建立建構函式
function People(name, age) {
    this.name = name;
    this.age = age;

    this.eat = function () {
        return 'eat';
    }
}

//建立例項
var p1 = new People("zero");
var p2 = new People("seven");

//呼叫例項內屬性和方法
console.log(p1.name)
console.log(p2.age)
p1.eat()

//檢視例項物件
console.log(p1);
console.log(p1);

 

4、繼承(ES5)(存在知識點模糊???)

- 組合繼承(構造繼承屬性,原型繼承方法)

注意:

  • 必須存在兩個建構函式才可以完成繼承。
  • 繼承是屬性和方法的複用
  • 建立子類例項時,可以向父類建構函式傳參
  • call方法用來完成屬性的繼承
    (繼承過程中,子類呼叫call方法,傳入父類的this和子類傳入的引數)
  • prototype原型用於繼承方法
// 父級
function Sup(name) {
    this.name = name;
    this.fn = function () {
        console.log('fn class');
    }
}

// 子級
function Sub(name) {
    // 繼承屬性
    Sup.call(this, name);
}
// 繼承方法
Sub.prototype = new Sup;

// 建立子級物件
var sub = new Sub("subClass");
// 使用屬性
console.log(sub.name);
// 使用方法
sub.fn();
​
// 指向自身建構函式
Sub.prototype.constructor = Sub;

5、類及繼承(ES6)

注意:

  • 構造器 constructor 
  • 子類通過 子類名 extends 父類名{} 進行繼承操作
            class Person {
		// 構造器:建立物件完成初始化操作
	    constructor (name, age) {
	        this.name = name;
	        this.age = age;
	    }
	    // 例項方法:只能由物件呼叫
	    eat () {
	        console.log(this.name + '吃吃吃');
	    }
	    // 類方法:只能由類呼叫
	    static create () {
	        console.log('誕生');
	    }
	}
	let p1 = new Person('zero', 8);
	let p2 = new Person('seven', 58);

	console.log(p1.age);
	p2.eat();
	// Person.eat();
	Person.create();
	// p2.create();


	// 繼承
	class Student extends Person {
		constructor (name, age, sex) {
			// super指向父級
			super(name, age);
			this.sex = sex;
		}
	}

	let s1 = new Student("張三", 18, "男");
	// 屬性的繼承
	console.log(s1.name, s1.age, s1.sex);
	console.log();
	// 方法的繼承
	s1.eat();
	// 繼承為全繼承
	Student.create();