目录
套路:先创建空Object对象,再动态添加属性/方法
适用场景:起始时不确定对象内部数据
问题:语句太多
- var p = new Object();
- p.name = "Tom";
- p.age = 12;
- p.setName = function (name) {
- this.name = name;
- };
-
- p.setName("jack");
- console.log(p.name, p.age);
方式二:对象字面量模式
套路:使用{}创建对象,同时指定属性/方法
适用场景:起始时对象内部数据是确定的
问题:如果创建多个对象,有重复代码
- var p = {
- name: "Tom",
- age: 12,
- setName: function (name) {
- this.name = name;
- },
- };
- // 测试
- console.log(p.name, p.age);
- p.setName("jack");
- console.log(p.name, p.age);
方法三:工厂模式
套路:通过工厂函数动态创建对象并返回
适用场景:需要创建多个对象
问题:对象没有一个具体的类型,都是object类型
- function createPerson(name,age){//返回一个对象的函数==>工厂函数
-
- var obj={
- name:name,
- age:age,
- setName:function(name){
- this.name=name
- }
- }
- return obj
- }
- var p1=createPerson('tom',12)
- var p2=createPerson('bob',13)
方法四: 自定义构造函数模式
套路:自定义构造函数,通过new创建对象
适用场景:需要创建多个类型确定的对象
问题:每个对象都有相同的数据,浪费内存
- function Person(name,age){
- this.name=name,
- this.age=age,
- this.setName=function(name){
- this.name=name
- }
-
- }
- var p1=new Person('tom',12)
- var p2=new Person('bob',13)
-
- function createStudent(name,age){
- this.name=name,
- this.age=age
- }
- var s=new createStudent('jack',15)
方法五:构造函数+原型的组合模式
套路:自定义构造函数,属性在函数中初始化,方法添加到原型上
适用场景:需要创建多个类型确定的对象
- function Person(name,age){
- this.name=name,
- this.age=age
- }
- Person.prototype.setName=function(name){
- this.name=name
- }
- var p1=new Person('tom',12)
- var p2=new Person('bob',13)
1.套路
2.关键
- function Supper(){
- this.supProp='Supper property'
- }
- Supper.prototype.showSupperProp=function(){
- console.log(this.supProp);
- }
-
- // 子类型
- function sub(){
- this.subProp='Sub property'
- }
- // 子类型的原型为父类型的一个实例对象
- Sub.prototype=new Supper()
- Sub.prototype.showSubProp=function(){
- console.log(this.subProp);
- }
- var sub=new Sub()
- sub.showSubProp()
- sub.toString()
- sub.showSubProp()

方式2:借用构造函数继承(假的)
1.套路
2.关键
- function Person(name,age){
- this.name=name
- this.age=age
- }
- function Student(name,age,price){
- Person.call(this,name,age)
- // 相当于this.Person(name,age)
- this.price=price;
- }
- var a=new Student('tom',20,14000)
- console.log(s.name,s.age,s.price);
方式3:原型链+借用构造函数的组合继承
- function Person(name,age){
- this.name=name
- this.age=age
- }
- Person.prototype.setName=function(name){
- this.name=name
- }
- function Student(name,age,price){
- Person.call(this,name,age)//为了得到属性
- // 相当于this.Person(name,age)
- this.price=price;
- }
- Student.prototype.setprice=function(price){
- this.price=price
- }
- Student.prototype=new Person()
- Student.prototype.constructor=Student//修正contructor
-
- var s=new Student('tom',14,160000)
- s.setName('bob')
- s.setprice(19000)
- console.log(s.name,s.age,s.price);
- function fun(n,o){
- console.log(o);
- return{
- fun:function(m){
- return fun(m,n)
- }
- }
- }
- var a=fun(0)//undefined
- a.fun(1)//0
- a.fun(2)//0
- a.fun(3)//0
-
- var b=fun(0).fun(1).fun(2).fun(3)//undefined,0,1,2
-
- var c=fun(0).fun(1)//undefined,0
- c.fun(2)//1
程序的一次执行,它占有一片独有的内存空间,可以通过windows任务管理器查看进程
图解

相关知识:
相关问题
何为多进程与多线程?
多进程运行:一应用程序可以同时启动多个实例运行
多线程:在一个进程内,同时有多个线程运行
比较单线程与多线程?
多线程
优点
缺点
单线程
优点
缺点
JS是单线程,但使用H5中的Web Workers可以多线程运行
浏览器运行是多线程运行的
浏览器是单进程还是多进程的?
浏览器内核
1.支撑浏览器运行的最核心的程序
2.不同的浏览器可能不一样

3.内核由很多模块组成

定时器引发的思考
1.定时器是定时执行的吗?
2.定时器回调函数是在分线程执行的吗?
3.定时器是如何实现的?
- window.onload = function () {
- document.getElementById("btn").onclick = function () {
- var start = new Date();
- // 同理
- // var start=Date.now()
- console.log("启动定时器前...");
- setTimeout(function () {
- console.log("定时器执行了", Date.now() - start);
- }, 1000);
- console.log("启动定时器后...");
- // 做一个长时间的工作
- for (let i = 0; i < 100000000; i++) {}
- };
- };
1.如何证明JS执行是单线程的?
2.为什么JS要用单线程模式,而不用多线程模式?
3.代码的分类
4.JS引擎执行代码的基本流程
后面在某个时刻才会执行回调函数
- setTimeout(function(){
- console.log('timeout 2');
- alert('2222')
- },2000)
- setTimeout(function(){
- console.log('timeout 1');
- alert('111')
- },1000)
- function fn(){
- console.log('fn()');
- }
- fn()
-
- console.log('alert()之前');
- alert('------')
- console.log('alert()之后');
注意:函数提升 定时器按照时间执行
运转流程
模型原理图
JS(下面的框)

相关知识


图解

不足
- 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>Documenttitle>
- <script>
- window.onload = function () {
- // console.log(f(7))
- var input = document.getElementById("number");
- var btn = document.getElementById("btn");
- btn.onclick = function () {
- var number = input.value;
- // 创建一个worker对象
- var worker = new Worker("worker.js");
- // 绑定接收消息的监听
- worker.onmessage = function (event) {
- console.log("主线程接受分线程返回的数据" + event.date);
- alert(event.data);
- };
- // 向分线程发送消息
- worker.postMessage(number);
- console.log("主线程向分线程发送数据:");
- };
- };
- script>
- head>
- <body>
- <input placeholder="数值" id="number" />
- <button id="btn">测试button>
- body>
- html>
- function f(n) {
- return n <= 2 ? 1 : f(n - 1) + f(n - 2);
- }
- var onmessage=function(event){
- var number=event.data
- console.log('分线程接收到主线程发送的数据'+number);
- // 计算
- var result=f(number)
- postMessage(result)
- console.log('分线程向主线程返回数据'+result);
- }