函数和对象
一、初始面向对象
面向对象中的类和对象:
- 类:JS中的类本质还是一个函数 是抽象不具体function Person(){ // 是一个类的话字母会大写}
new Person(); // 此时Persion是一个类
Person(); // 此时Person就是一个函数
- 对象:
var obj = {name:“wc”}; obj就是一个对象,在JS中一个{}就是一个对象。
如果在JAVA中,对象都是new出来的,先有class,后有对象。
面向对象特征:
- 抽象:把一个具体问题抽象化。
- 封装:把属性和方法封装到类中,在JS中说对象。
var obj = {
name:“wc”,
age:100,
say:function(){
log(“say…”);
}
}
- 继承:一个类可类可以继承另一个类,在JS是通过函数表达式。
- 多态
JS默认提供了很多的类
包含有:
- Number
- String
- Boolean
- Object
- Date
- Math 单体内置类,不需要new(常驻内存不需要new)
- Array
二、JS中一切数据都是对象
这里的数据不是指数据类型,而是一切数据,不仅包含了基本数据类型、引用数据类型、还包含了html元素,以及console和window。因为他们都是数据,所以都是对象
到底什么是对象呢?以及对象可以进行哪些操作呢?
- 所谓的对象原来是属性的无序集合。
- 我们可以对其进行:增删查改
- 增: 给添加添加新的属性
var obj = { name:"wangcai" } console.log(obj.name); // 打印出obj中name属性 访问 obj.name = "xiaoqiang"; // 修改属性 console.log(obj.name); // 同名属性后面的把前面的覆盖掉 obj.age = 1100; // 新增属性 obj["address"] = "北京"; // 新增属性 console.log(obj)
- 删:
var obj = { name:"wangcai", age:100 } console.log(obj) // delete 是一个运算符 是单目运算符 表示删除一个属性 delete obj.age; console.log(obj)
- 查:
如何访问对象里面的属性 键可以使用引号包起来,也可以不使用引号包起来
- 1)打点调用
- 2)通过[]来调用
仅作了解 通常都是打点调用
var obj = { name:"wangcai", // name叫属性名 “wangbai"叫属性值 123:456, // 123是属性名(键),456是属性值(值) "1+1":2, // "1+1"是属性名 2是属性值 "a":"hello", "b":null, "c":function () { console.log("c..") }, "d":["1","2","3"], "e":{ x:"xxx" } } console.log(obj.name) console.log(obj[123]); // 456 console.log(obj.a); // hello console.log(obj["1+1"]); // 2 // 如果我们的键是一个变量 我们需要通过变量去访问 必须使用[] var k = "name"; console.log(obj[k]); // wangcai
- 改:
通过添加已有属性,就会改变原有的值。方法和增一样。
三、对象中的属性有4大特征
- configurable 表示是否可以被删除 tru表示可以删除
- 2)writable 表示是否可以修改 tru示可以修改
- 3)enumerable 是否可以枚举 是否以出 true表示可以输出
- 4)value 属性值 默认是und
var obj = { name:"wangcai" console.log(Object.getOwnPropertyDescriptor(obj, "name"));
// 通过Object.getOwnPropertyDescriptor 获取属性的特征。结果如下:
configurable: true
writable: true
enumerable: true
value: "wangc
问:数组中有一个属性叫length 它为什么不能输出
var arr = ["a"] // enumerablefalse console.log(ObjecgetOwnPropertyDescriptor(arr"length"));
- 给一个对象添加一个属性时,也可以设置上面的4个特征
// Object.defineProperty()
var obj = {}; Object.defineProperty(obj,"name",{ configurable:false, writable:false, enumerable:true, value:"wangcai" }) console.log(obj)//先查看obj里面属性的值 delete obj.name;//看是否会删除name属性 console.log(obj);//验证是否删除了 obj.name = "xxx";//看是否会修改name的值 console.log(obj);//验证是否修改了 for (const objKey in obj) { console.log(obj[objKey]); }//for in:操作对象中的属性之遍历对象
四、属性的分类(私有属性 公有属性)
对象上的属性是分成两类的
- 私有属性
- 公有属性
var obj = { name:"wangcai", age:100 }
// 通过一个api可以查看一个属性是否是私属性
// 叫 hasOwnProperty();
console.log(obj.hasOwnPropert("name"));
// true 查看name是否是obj私有属性
console.log(obj.hasOwnProperty("age");
// true
- 公有属性也叫:原型属性
console.log(obj) console.dir(obj.hasOwnPropert("toString"));
// false 查看toStrin是否是obj的私有属性
console.log(obj.hasOwnPropert("__proto__"))
// false 查__proto__是否是obj的私有属性
console.log(obj.__proto__hasOwnProperty("toString"));
//true // 查看toString是否是obj__proto__这个对象的私有属性
- 对于obj来说:name和age是它的私有性 toString是它的公有属性
- 对于obj.__proto__来说:toString是的私有属性
也就是说一个属性是私有属性还是公有性,还需要看它针对是谁。
var arr = ["a","b"]; console.dir(arr); console.log(arr.hasOwnPropert("length")); // true console.log(arr.hasOwnPropert("push")); // false console.log(arr.hasOwnPropert("__proto__")); // false console.log(arr.__proto__hasOwnProperty("push")); // true // delete只能删除私有属性 不能删除公属性 delete arr[0]; console.log(arr); delete arr.push; console.dir(arr)
如果一个私有属性和公有属性重名了 把公有属性覆盖掉
var a1 = ["a"]; console.dir(a1) a1.push("b") console.dir(a1) a1.push = function () { console.log("自己的push") } a1.push("c");
五、函数的四种角色
角色一:一个普通的函数
function f() { console.log("f...") } // f(); 作用1:让函数体执行 作用2得到返回值 f();
角色2:在对象中可以当成一个方法
let obj = { say:function () { // 方法 console.log("say...") }, sleep:function () { // 方法 console.log("sleep...") } } obj.say() obj.sleep()
角色3:类 构造器
function NBAPlayer() { } var nbaPlayer1 = new NBAPlayer(); var nbaPlayer2 = new NBAPlayer(); var nbaPlayer3 = new NBAPlayer(); console.log(nbaPlayer1); console.log(nbaPlayer2); console.log(nbaPlayer3);
角色4:也可以当作是一个对象
function F() { } F.name1 = "wangcai"; F.age = 100 console.log(F.name1) console.log(F.age)