mix混入函数

Posted aichitudousien

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mix混入函数相关的知识,希望对你有一定的参考价值。

@

目录

概述

记录一下使用mix函数的过程,公式为:
mix(x, y, a): x, y的线性混叠, x(1-a) + y*a; a为0 结果为x, a为1 结果为y
先看代码

let shader = 
    vs: `
      varying vec2 v_uv;
      void main() 
        v_uv = uv;
        gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4( position, 1.0 );
      
        `,
    fs: `
      varying vec2 v_uv;
      vec3 colorA = vec3(0.0,0.0,1.0);
      vec3 colorB = vec3(1.0,0.0,0.0);
      void main() 
        // mix(x, y, a): x, y的线性混叠, x(1-a) + y*a;  a为0 结果为x, a为1 结果为y
        vec3 color = mix(colorA, colorB, v_uv.x);
        gl_FragColor = vec4(color, 1.0);
      
        `,
    uniform: 
    
  

  let geometry = new THREE.PlaneBufferGeometry(20, 20);

  let material = new THREE.ShaderMaterial(
    vertexShader: shader.vs,
    fragmentShader: shader.fs,
    uniforms: shader.uniform,
    transparent: true,
    side: THREE.DoubleSide
  )

  let mesh = new THREE.Mesh(geometry, material);
  mesh.rotateX(-Math.PI / 2);
  scene.add(mesh);

最后的效果为:

设计模式:混入模式

第一次完整看一遍(JavaScript设计模式)该模式的介绍,感觉这不就是继承而已吗,只不过可能是部分继承。

混入(Mixin)模式

定义:

Mixin是可以轻松被一个子类或一组子类继承功能的类,目的是函数复用。继承Mixin是扩展功能的方式,另外也可能从多个Mixin类进行继承。

继承方式:

这个模式关键点在于继承,JavaScript上有几种实现继承的方式:

1. 原型继承

function A(){
     this.name = "A";
}
function B(){
}
B.prototype= new A();
var b = new B();
console.log(b instanceof A);     //true
console.log(b instanceof B);     //true

PS:无法实现多继承。

2. 拷贝继承

function extend(receiveClass, givingClass){
     for(var key in givingClass.prototype){
           receiveClass.prototype[key] = givingClass.prototype[key];
      }
}
function A(){
}
A.prototype.hello = function(){
     console.log("hello");
}
function B(){
}
extend(B, A);
var b = new B();
console.log(b instanceof A);     //false
console.log(b instanceof B);     //true

PS:支持多继承,但效率低。

3. 构造继承

function A1(){
     this.name = "A";
}
function A2(){
     this.age = 18;
}
function B(){
     A1.call(this);
     A2.call(this);
     this.desc =  "Test";
}
var b = new B();
console.log(b instanceof A);     //false
console.log(b instanceof B);     //true

PS:支持多继承

4. 实例继承

function A(){
     this.name = "A";
}
function B(){
     var instance = new A();
     instance.desc = "Test";
     return instance;
}
var b = new B();
console.log(b instanceof A);     //true
console.log(b instanceof B);     //false

PS:这种方式我觉得很糟糕,生成的对象本质是父类的实例,不是子类的对象,当然也不支持多继承。

例子:

// Define a simple Car constructor
var Car = function ( settings ) {
    this.model = settings.model || "no model provided";
    this.color = settings.color || "no colour provided";
};
// Mixin
var Mixin = function () {};
Mixin.prototype = {
    driveForward: function () {
        console.log( "drive forward" );
    },
    driveBackward: function () {
        console.log( "drive backward" );
    },
    driveSideways: function () {
        console.log( "drive sideways" );
    }
};
// Extend an existing object with a method from another
function augment( receivingClass, givingClass ) {
    // only provide certain methods
    if ( arguments[2] ) {
        for ( var i = 2, len = arguments.length; i < len; i++ ) {
            receivingClass.prototype[arguments[i]] = givingClass.prototype[arguments[i]];
        }
    }
    else {
        for ( var methodName in givingClass.prototype ) {
            if ( !Object.hasOwnProperty.call(receivingClass.prototype, methodName) ) {
                receivingClass.prototype[methodName] = givingClass.prototype[methodName];
            }
        }
    }
}
 
augment( Car, Mixin, "driveForward", "driveBackward" );
var myCar = new Car({
    model: "Ford Escort",
    color: "blue"
});
myCar.driveForward();
myCar.driveBackward();
 
augment( Car, Mixin );
var mySportsCar = new Car({
    model: "Porsche",
    color: "red"
});
mySportsCar.driveSideways();

这个例子里面Car类所扩展的功能,是通过拷贝继承的继承方式继承的。

优点:

1. 减少系统中的重复功能及增加函数复用。

缺点:

1. 将功能注入对象原型中,会导致原型污染和函数起源方面的不确定性。

PS:简单说就是找不到扩展的方法的来源。

结论:

混入模式是一种简单的结构型模式,目的是扩展子类功能,子类可从多个Mixin类收集功能。

 

参考文献

1. http://raychase.iteye.com/blog/1337415 (JavaScript实现继承的几种方式)

2. 《JavaScript设计模式》by 徐涛【译】

 

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5617570.html

以上是关于mix混入函数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级 面向对象--最简单的继承方式,混入mix

面向对象之笔记三-------------- 原型链

Ex1. CocoaPods 中的 Ruby 特性之 Mix-in

Vue中的混入对象mixins

vue中 利用混入定义全局变量函数筛选器

Scala比较器:Ordered与Ordering