<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
window.onload = function () {
"use strict";
// //dom元素添加练习
// let lessons = [
// { name: "js", click: 23 },
// { name: "node", click: 192 }
// ];
// let ul = document.createElement("ul");
// lessons.reduce((pre, cur) => {
// let li = document.createElement("li");
// li.innerHTML = `name:${cur.name}---age:${cur.click}`;
// ul.appendChild(li);
// }, []);
// document.body.appendChild(ul);
// //完成对象的深拷贝与浅拷贝
// let obj = {
// name: "后盾人"
// };
// function stu(name) {
// return {
// name,
// show() {
// console.log(this.name);
// }
// };
// }
// const lisi = stu("李四");
// lisi.show();
// const xj = stu("向军");
// xj.show();
// //使用构造函数创建对象
// function Person(name, age, gender) {
// this.name = name;
// this.age = age;
// this.gender = gender;
// this.show = function () {
// console.log(this)
// }
// }
// //在调用构造函数的时候 需要使用new 关键字
// // 使用构造函数的话 可以知道我是由那个构造函数创建的
// let txt = new Person("lxl", "12", "男");
// txt.show();
// console.log(txt);
// function User() {
// this.show = function () {
// console.log(this);
// };
// }
// let hd = new User();
// hd.show(); //User
// let x = hd.show;
// x(); //undefined
// //js 里面的大多数数据都是通过构造函数创建的
// let num = new Number(99);
// console.log(num);
// let strind = new String("后盾人");
// console.log(strind);
// let boolean = new Boolean(true);
// console.log(boolean);
// let data = new Date();
// console.log(data.valueOf());
// console.log(data * 1);
// //在js中函数也是一个对象
// function hdd(name) { };
// console.log(hdd.toString());
// console.log(hdd.length)
// console.log(hd.constructor)
// function User(name, age) {
// this.name = name;
// this.age = age;
// this.info = function () {
// return this.age > 50 ? "中年人" : "年轻人";
// };
// this.about = function () {
// return `${this.name}是${this.info()}`;
// };
// }
// let lisi = new User("李四", 22);
// console.log(lisi.about());
// console.log(lisi.info());
// console.log(lisi.name);
// 创建构造函数只能 他的属性只能在在内部使用 无法在外面使用
// function User(name, age) {
// let data = { name, age };
// //定义可以访问的到的函数方法
// let info = function () {
// return data.age > 50 ? "你不在年轻" : "你依然年轻"
// };
// // 通过自定义变量接受到的 方法 只能在函数内部使用
// this.message = function () {
// return `${data.name}--${info()}`
// }
// };
// let test = new User("小科", 56);
// // console.log(test.message());
// // console.log(test.info());// 因为对象的抽象 将方法封装在里面无法正常访问的到
// const user = {
// name: "向军",
// age: 18
// };
// Object.defineProperty(user,"name",{
// value:"后盾热",
// configurable:true,
// writable:false,
// enumerable:true,
// })
// // 获取指定属性的描述
// let desc = Object.getOwnPropertyDescriptor(user,"name");
// console.log(JSON.stringify(desc,null,2));
// console.log(JSON.stringify(desc,null,2));
//上述方法只能定义一个属性
//设置多个属性
// Object.defineProperties(user, {
// age: {
// value: 1184,
// configurable: true,
// enumerable: false,
// writable: false
// }
// });
// let user = {
// name:"后盾人",
// }
// Object.defineProperties(user,{
// name:{
// configurable:true,
// writable:true,
// enumerable:true,
// },
// age:{
// value:23,
// enumerable:true,
// writable:true,
// configurable:true,
// }
// })
// let desc = Object.getOwnPropertyDescriptors(user,"name" ,"age");
// console.log(desc);
// Object.preventExtensions(user);// 这样的话 就无法向对象里面添加属性
// console.log(JSON.stringify(desc, null, 2));
// console.log(Object.isExtensible(user));
// //标记seal 属性 就是不能被删除
// Object.seal(user);
// let ceshi = Object.getOwnPropertyDescriptor(user, "name");
// console.log(ceshi);
// //检查指定的对象是不是可以 被删除
// let desc_data = Object.isSealed(user);// 返回值是 true
// console.log(desc_data);
// 对象的访问器属性
const user = {
data: { name: "后盾人", age: null },
set age(value) {
if (typeof value != "number" || value > 100 || value < 23) {
throw new Error('请输入正确的年龄格式')
}
this.data.age = value;
},
get age() {
return `年龄 :${this.data.age}`
}
}
user.age = 45;
console.log(user.age);
//所谓的访问器属性 就是在设置和访问对象属性的时候添加一层判断 来判断设置和添加属性的保护 在设置的时候提供一个属性的保护
// 若只添加一个的话 添加谁 就能可以 实现相对应的设置 或者访问
let lesson = {
lists: [
{ name: "js", price: 100 },
{ name: "mysql", price: 212 },
{ name: "vue.js", price: 98 }
],
get total(){
return this.lists.reduce((pre,cur)=>{
return pre + cur.price
},0)
}
};
lesson.total = 252;
console.log(lesson.total);
//
}
</script>
</head>
<body>
</body>
</html>